From 6bd2917e6e8d9a48ea1c964e10d1f58925bf9abb Mon Sep 17 00:00:00 2001 From: Gergely Brautigam <182850+Skarlso@users.noreply.github.com> Date: Thu, 23 May 2024 17:01:28 +0200 Subject: [PATCH] added wasm rebuild --- pkg/create_html_output.go | 4 +- pkg/generate.go | 4 +- pkg/generate_test.go | 8 +- ...nfrastructure.cluster.x-k8s.io_sample.html | 7388 ++++++++++++++++- wasm/app-worker.js | 6 +- wasm/app.go | 6 +- wasm/app.js | 2 +- wasm/index.html | 24 +- wasm/web/app.wasm | Bin 26887033 -> 27713643 bytes 9 files changed, 7334 insertions(+), 108 deletions(-) diff --git a/pkg/create_html_output.go b/pkg/create_html_output.go index ec3130e..1e725ae 100644 --- a/pkg/create_html_output.go +++ b/pkg/create_html_output.go @@ -70,13 +70,13 @@ func RenderContent(w io.Writer, crdContent []byte, comments, minimal bool) error parser := NewParser(crd.Spec.Group, crd.Spec.Names.Kind, comments, minimal) for _, version := range crd.Spec.Versions { - out, err := parseCRD(version.Schema.OpenAPIV3Schema.Properties, version.Name, minimal, rootRequiredFields) + out, err := parseCRD(version.Schema.OpenAPIV3Schema.Properties, version.Name, minimal, RootRequiredFields) if err != nil { return fmt.Errorf("failed to parse properties: %w", err) } var buffer []byte buf := bytes.NewBuffer(buffer) - if err := parser.ParseProperties(version.Name, buf, version.Schema.OpenAPIV3Schema.Properties, rootRequiredFields); err != nil { + if err := parser.ParseProperties(version.Name, buf, version.Schema.OpenAPIV3Schema.Properties, RootRequiredFields); err != nil { return fmt.Errorf("failed to generate yaml sample: %w", err) } versions = append(versions, Version{ diff --git a/pkg/generate.go b/pkg/generate.go index d045cef..edf7dd2 100644 --- a/pkg/generate.go +++ b/pkg/generate.go @@ -13,7 +13,7 @@ import ( const array = "array" -var rootRequiredFields = []string{"apiVersion", "kind", "spec"} +var RootRequiredFields = []string{"apiVersion", "kind", "spec"} // Generate takes a CRD content and path, and outputs. func Generate(crd *v1beta1.CustomResourceDefinition, w io.WriteCloser, enableComments, minimal bool) (err error) { @@ -24,7 +24,7 @@ func Generate(crd *v1beta1.CustomResourceDefinition, w io.WriteCloser, enableCom }() parser := NewParser(crd.Spec.Group, crd.Spec.Names.Kind, enableComments, minimal) for i, version := range crd.Spec.Versions { - if err := parser.ParseProperties(version.Name, w, version.Schema.OpenAPIV3Schema.Properties, rootRequiredFields); err != nil { + if err := parser.ParseProperties(version.Name, w, version.Schema.OpenAPIV3Schema.Properties, RootRequiredFields); err != nil { return fmt.Errorf("failed to parse properties: %w", err) } diff --git a/pkg/generate_test.go b/pkg/generate_test.go index 5886d6e..1febcaf 100644 --- a/pkg/generate_test.go +++ b/pkg/generate_test.go @@ -24,7 +24,7 @@ func TestGenerate(t *testing.T) { version := crd.Spec.Versions[0] parser := NewParser(crd.Spec.Group, crd.Spec.Names.Kind, false, false) - require.NoError(t, parser.ParseProperties(version.Name, buffer, version.Schema.OpenAPIV3Schema.Properties, rootRequiredFields)) + require.NoError(t, parser.ParseProperties(version.Name, buffer, version.Schema.OpenAPIV3Schema.Properties, RootRequiredFields)) golden, err := os.ReadFile(filepath.Join("testdata", "sample_crd_golden.yaml")) require.NoError(t, err) @@ -44,7 +44,7 @@ func TestGenerateWithExample(t *testing.T) { parser := NewParser(crd.Spec.Group, crd.Spec.Names.Kind, false, false) version := crd.Spec.Versions[0] - require.NoError(t, parser.ParseProperties(version.Name, buffer, version.Schema.OpenAPIV3Schema.Properties, rootRequiredFields)) + require.NoError(t, parser.ParseProperties(version.Name, buffer, version.Schema.OpenAPIV3Schema.Properties, RootRequiredFields)) golden, err := os.ReadFile(filepath.Join("testdata", "sample_crd_with_example_golden.yaml")) require.NoError(t, err) @@ -64,7 +64,7 @@ func TestGenerateWithComments(t *testing.T) { parser := NewParser(crd.Spec.Group, crd.Spec.Names.Kind, true, false) version := crd.Spec.Versions[0] - require.NoError(t, parser.ParseProperties(version.Name, buffer, version.Schema.OpenAPIV3Schema.Properties, rootRequiredFields)) + require.NoError(t, parser.ParseProperties(version.Name, buffer, version.Schema.OpenAPIV3Schema.Properties, RootRequiredFields)) golden, err := os.ReadFile(filepath.Join("testdata", "sample_crd_with_comments_golden.yaml")) require.NoError(t, err) @@ -84,7 +84,7 @@ func TestGenerateMinimal(t *testing.T) { parser := NewParser(crd.Spec.Group, crd.Spec.Names.Kind, false, true) version := crd.Spec.Versions[0] - require.NoError(t, parser.ParseProperties(version.Name, buffer, version.Schema.OpenAPIV3Schema.Properties, rootRequiredFields)) + require.NoError(t, parser.ParseProperties(version.Name, buffer, version.Schema.OpenAPIV3Schema.Properties, RootRequiredFields)) golden, err := os.ReadFile(filepath.Join("testdata", "sample_crd_with_minimal_example_golden.yaml")) require.NoError(t, err) diff --git a/sample-crd/awsclusters.infrastructure.cluster.x-k8s.io_sample.html b/sample-crd/awsclusters.infrastructure.cluster.x-k8s.io_sample.html index 7f96105..a5b20e2 100644 --- a/sample-crd/awsclusters.infrastructure.cluster.x-k8s.io_sample.html +++ b/sample-crd/awsclusters.infrastructure.cluster.x-k8s.io_sample.html @@ -57,8 +57,283 @@
AWSClusterSpec defines the desired state of an EC2-based Kubernetes cluster.
+-
AWSCluster is the schema for Amazon EC2 based Kubernetes Cluster API.
-# 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
-apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
-# 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
-kind: AWSCluster
-# AWSClusterSpec defines the desired state of an EC2-based Kubernetes cluster.
-spec:
-
- 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
+AWSClusterSpec defines the desired state of an EC2-based Kubernetes cluster.
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
-AdditionalTags is an optional set of tags to add to AWS resources managed by the AWS provider, in addition to the ones added by default.
+AWSClusterSpec defines the desired state of an EC2-based Kubernetes cluster.
-Bastion contains options to configure the bastion host.
+AllowedCIDRBlocks is a list of CIDR blocks allowed to access the bastion host. They are set as ingress rules for the Bastion host's Security Group (defaults to 0.0.0.0/0).
+AMI will use the specified AMI to boot the bastion. If not specified, the AMI will default to one picked out in public space.
+DisableIngressRules will ensure there are no Ingress rules in the bastion host's security group. Requires AllowedCIDRBlocks to be empty.
+Enabled allows this provider to create a bastion host instance with a public ip to access the VPC private network.
+InstanceType will use the specified instance type for the bastion. If not specified, Cluster API Provider AWS will use t3.micro for all regions except us-east-1, where t2.micro will be the default.
+ControlPlaneEndpoint represents the endpoint used to communicate with the control plane.
+The hostname on which the API server is serving.
+The port on which the API server is serving.
+ControlPlaneLoadBalancer is optional configuration for customizing control plane behavior.
+AdditionalSecurityGroups sets the security groups used by the load balancer. Expected to be security group IDs This is optional - if not provided new security groups will be created for the load balancer
+CrossZoneLoadBalancing enables the classic ELB cross availability zone balancing. + With cross-zone load balancing, each load balancer node for your Classic Load Balancer distributes requests evenly across the registered instances in all enabled Availability Zones. If cross-zone load balancing is disabled, each load balancer node distributes requests evenly across the registered instances in its Availability Zone only. + Defaults to false.
+HealthCheckProtocol sets the protocol type for classic ELB health check target default value is ClassicELBProtocolSSL
+Name sets the name of the classic ELB load balancer. As per AWS, the name must be unique within your set of load balancers for the region, must have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and cannot begin or end with a hyphen. Once set, the value cannot be changed.
+Scheme sets the scheme of the load balancer (defaults to internet-facing)
+Subnets sets the subnets that should be applied to the control plane load balancer (defaults to discovered subnets for managed VPCs or an empty set for unmanaged VPCs)
+IdentityRef is a reference to a identity to be used when reconciling this cluster
+Kind of the identity.
+Name of the identity.
+ImageLookupBaseOS is the name of the base operating system used to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupBaseOS.
+ImageLookupFormat is the AMI naming format to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/
+ImageLookupOrg is the AWS Organization ID to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg.
+NetworkSpec encapsulates all things related to AWS network.
+CNI configuration
+CNIIngressRules specify rules to apply to control plane and worker node security groups. The source for the rule will be set to control plane and worker security group IDs.
+SecurityGroupProtocol defines the protocol type for a security group rule.
+SecurityGroupOverrides is an optional set of security groups to use for cluster instances This is optional - if not provided new security groups will be created for the cluster
+Subnets configuration.
+AvailabilityZone defines the availability zone to use for this subnet in the cluster's region.
+CidrBlock is the CIDR block to be used when the provider creates a managed VPC.
+ID defines a unique identifier to reference this resource.
+IPv6CidrBlock is the IPv6 CIDR block to be used when the provider creates a managed VPC. A subnet can have an IPv4 and an IPv6 address. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object.
+IsIPv6 defines the subnet as an IPv6 subnet. A subnet is IPv6 when it is associated with a VPC that has IPv6 enabled. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object.
+IsPublic defines the subnet as a public subnet. A subnet is public when it is associated with a route table that has a route to an internet gateway.
+NatGatewayID is the NAT gateway id associated with the subnet. Ignored unless the subnet is managed by the provider, in which case this is set on the public subnet where the NAT gateway resides. It is then used to determine routes for private subnets in the same AZ as the public subnet.
+RouteTableID is the routing table id associated with the subnet.
+VPC configuration.
+AvailabilityZoneSelection specifies how AZs should be selected if there are more AZs in a region than specified by AvailabilityZoneUsageLimit. There are 2 selection schemes: Ordered - selects based on alphabetical order Random - selects AZs randomly in a region Defaults to Ordered
+AvailabilityZoneUsageLimit specifies the maximum number of availability zones (AZ) that should be used in a region when automatically creating subnets. If a region has more than this number of AZs then this number of AZs will be picked randomly when creating default subnets. Defaults to 3
+CidrBlock is the CIDR block to be used when the provider creates a managed VPC. Defaults to 10.0.0.0/16.
+ID is the vpc-id of the VPC this provider should use to create resources.
+InternetGatewayID is the id of the internet gateway associated with the VPC.
+IPv6 contains ipv6 specific settings for the network. Supported only in managed clusters. This field cannot be set on AWSCluster object.
+CidrBlock is the CIDR block provided by Amazon when VPC has enabled IPv6.
+EgressOnlyInternetGatewayID is the id of the egress only internet gateway associated with an IPv6 enabled VPC.
+PoolID is the IP pool which must be defined in case of BYO IP is defined.
+The AWS Region the cluster lives in.
+S3Bucket contains options to configure a supporting S3 bucket for this cluster - currently used for nodes requiring Ignition (https://coreos.github.io/ignition/) for bootstrapping (requires BootstrapFormatIgnition feature flag to be enabled).
+ControlPlaneIAMInstanceProfile is a name of the IAMInstanceProfile, which will be allowed to read control-plane node bootstrap data from S3 Bucket.
+Name defines name of S3 Bucket to be created.
+NodesIAMInstanceProfiles is a list of IAM instance profiles, which will be allowed to read worker nodes bootstrap data from S3 Bucket.
+SSHKeyName is the name of the ssh key to attach to the bastion host. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name)
+AWSClusterStatus defines the observed state of AWSCluster.
+Instance describes an AWS instance.
+Addresses contains the AWS instance associated addresses.
+The machine address.
+Machine address type, one of Hostname, ExternalIP or InternalIP.
+Availability zone of instance
+Indicates whether the instance is optimized for Amazon EBS I/O.
+Specifies whether enhanced networking with ENA is enabled.
+The name of the IAM instance profile associated with the instance, if applicable.
+The ID of the AMI used to launch the instance.
+The current state of the instance.
+Specifies ENIs attached to instance
+Configuration options for the non root storage volumes.
+Device name
+Encrypted is whether the volume should be encrypted or not.
+EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller.
+IOPS is the number of IOPS requested for the disk. Not applicable to all types.
+Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater).
+Throughput to provision in MiB/s supported for the volume type. Not applicable to all types.
+Type is the type of the volume (e.g. gp2, io1, etc...).
+The private IPv4 address assigned to the instance.
+The public IPv4 address assigned to the instance, if applicable.
+Configuration options for the root storage volume.
+Device name
+Encrypted is whether the volume should be encrypted or not.
+EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller.
+IOPS is the number of IOPS requested for the disk. Not applicable to all types.
+Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater).
+Throughput to provision in MiB/s supported for the volume type. Not applicable to all types.
+Type is the type of the volume (e.g. gp2, io1, etc...).
+SecurityGroupIDs are one or more security group IDs this instance belongs to.
+SpotMarketOptions option for configuring instances to be run using AWS Spot instances.
+MaxPrice defines the maximum price the user is willing to pay for Spot VM instances
+The name of the SSH key pair.
+The ID of the subnet of the instance.
+Tenancy indicates if instance should run on shared or single-tenant hardware.
+The instance type.
+UserData is the raw data script passed to the instance which is run upon bootstrap. This field must not be base64 encoded and should only be used when running a new instance.
+IDs of the instance's volumes
+Conditions provide observations of the operational state of a Cluster API resource.
+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.
+A human readable message indicating details about the transition. This field may be empty.
+The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty.
+Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False.
+Status of the condition, one of True, False, Unknown.
+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.
+FailureDomains is a slice of FailureDomains.
+Attributes is a free form map of attributes an infrastructure provider might use or require.
+ControlPlane determines if this failure domain is suitable for use by control plane machines.
+NetworkStatus encapsulates AWS networking resources.
+APIServerELB is the Kubernetes api server classic load balancer.
+Attributes defines extra attributes associated with the load balancer.
+CrossZoneLoadBalancing enables the classic load balancer load balancing.
+IdleTimeout is time that the connection is allowed to be idle (no data has been sent over the connection) before it is closed by the load balancer.
+AvailabilityZones is an array of availability zones in the VPC attached to the load balancer.
+DNSName is the dns name of the load balancer.
+HealthCheck is the classic elb health check associated with the load balancer.
+A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years.
+A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years.
+Listeners is an array of classic elb listeners associated with the load balancer. There must be at least one.
+ClassicELBProtocol defines listener protocols for a classic load balancer.
+ClassicELBProtocol defines listener protocols for a classic load balancer.
+The name of the load balancer. It must be unique within the set of load balancers defined in the region. It also serves as identifier.
+Scheme is the load balancer scheme, either internet-facing or private.
+SecurityGroupIDs is an array of security groups assigned to the load balancer.
+SubnetIDs is an array of subnets in the VPC attached to the load balancer.
+SecurityGroups is a map from the role/kind of the security group to its unique name, if any.
+ID is a unique identifier.
+IngressRules is the inbound rules associated with the security group.
+List of CIDR blocks to allow access from. Cannot be specified with SourceSecurityGroupID.
+List of IPv6 CIDR blocks to allow access from. Cannot be specified with SourceSecurityGroupID.
+SecurityGroupProtocol defines the protocol type for a security group rule.
+The security group id to allow access from. Cannot be specified with CidrBlocks.
+Name is the security group name.
++
AWSCluster is the schema for Amazon EC2 based Kubernetes Cluster API.
+# 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
+apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
+# 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
+kind: AWSCluster
+metadata: {}
+# AWSClusterSpec defines the desired state of an EC2-based Kubernetes cluster.
+spec:
+ # AdditionalTags is an optional set of tags to add to AWS resources managed by the AWS provider, in addition to the ones added by default.
+ additionalTags: {}
+ # Bastion contains options to configure the bastion host.
+ bastion:
+ # AllowedCIDRBlocks is a list of CIDR blocks allowed to access the bastion host. They are set as ingress rules for the Bastion host's Security Group (defaults to 0.0.0.0/0).
+ allowedCIDRBlocks: ["string"]
+ # AMI will use the specified AMI to boot the bastion. If not specified, the AMI will default to one picked out in public space.
+ ami: string
+ # DisableIngressRules will ensure there are no Ingress rules in the bastion host's security group. Requires AllowedCIDRBlocks to be empty.
+ disableIngressRules: true
+ # Enabled allows this provider to create a bastion host instance with a public ip to access the VPC private network.
+ enabled: true
+ # InstanceType will use the specified instance type for the bastion. If not specified, Cluster API Provider AWS will use t3.micro for all regions except us-east-1, where t2.micro will be the default.
+ instanceType: string
+ # ControlPlaneEndpoint represents the endpoint used to communicate with the control plane.
+ controlPlaneEndpoint:
+ # The hostname on which the API server is serving.
+ host: string
+ # The port on which the API server is serving.
+ port: 1
+ # ControlPlaneLoadBalancer is optional configuration for customizing control plane behavior.
+ controlPlaneLoadBalancer:
+ # AdditionalSecurityGroups sets the security groups used by the load balancer. Expected to be security group IDs This is optional - if not provided new security groups will be created for the load balancer
+ additionalSecurityGroups: ["string"]
+ # CrossZoneLoadBalancing enables the classic ELB cross availability zone balancing.
+ # With cross-zone load balancing, each load balancer node for your Classic Load Balancer distributes requests evenly across the registered instances in all enabled Availability Zones. If cross-zone load balancing is disabled, each load balancer node distributes requests evenly across the registered instances in its Availability Zone only.
+ # Defaults to false.
+ crossZoneLoadBalancing: true
+ # HealthCheckProtocol sets the protocol type for classic ELB health check target default value is ClassicELBProtocolSSL
+ healthCheckProtocol: string
+ # Name sets the name of the classic ELB load balancer. As per AWS, the name must be unique within your set of load balancers for the region, must have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and cannot begin or end with a hyphen. Once set, the value cannot be changed.
+ name: string
+ # Scheme sets the scheme of the load balancer (defaults to internet-facing)
+ scheme: "internet-facing"
+ # Subnets sets the subnets that should be applied to the control plane load balancer (defaults to discovered subnets for managed VPCs or an empty set for unmanaged VPCs)
+ subnets: ["string"]
+ # IdentityRef is a reference to a identity to be used when reconciling this cluster
+ identityRef:
+ # Kind of the identity.
+ kind: AWSCluster
+ # Name of the identity.
+ name: string
+ # ImageLookupBaseOS is the name of the base operating system used to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupBaseOS.
+ imageLookupBaseOS: string
+ # ImageLookupFormat is the AMI naming format to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/
+ imageLookupFormat: string
+ # ImageLookupOrg is the AWS Organization ID to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg.
+ imageLookupOrg: string
+ # NetworkSpec encapsulates all things related to AWS network.
+ network:
+ # CNI configuration
+ cni:
+ # CNIIngressRules specify rules to apply to control plane and worker node security groups. The source for the rule will be set to control plane and worker security group IDs.
+ cniIngressRules:
+ - description: string
+ fromPort: 1
+ # SecurityGroupProtocol defines the protocol type for a security group rule.
+ protocol: string
+ toPort: 1
+ # SecurityGroupOverrides is an optional set of security groups to use for cluster instances This is optional - if not provided new security groups will be created for the cluster
+ securityGroupOverrides: {}
+ # Subnets configuration.
+ subnets:
+ - availabilityZone: string
+ # CidrBlock is the CIDR block to be used when the provider creates a managed VPC.
+ cidrBlock: string
+ # ID defines a unique identifier to reference this resource.
+ id: string
+ # IPv6CidrBlock is the IPv6 CIDR block to be used when the provider creates a managed VPC. A subnet can have an IPv4 and an IPv6 address. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object.
+ ipv6CidrBlock: string
+ # IsIPv6 defines the subnet as an IPv6 subnet. A subnet is IPv6 when it is associated with a VPC that has IPv6 enabled. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object.
+ isIpv6: true
+ # IsPublic defines the subnet as a public subnet. A subnet is public when it is associated with a route table that has a route to an internet gateway.
+ isPublic: true
+ # NatGatewayID is the NAT gateway id associated with the subnet. Ignored unless the subnet is managed by the provider, in which case this is set on the public subnet where the NAT gateway resides. It is then used to determine routes for private subnets in the same AZ as the public subnet.
+ natGatewayId: string
+ # RouteTableID is the routing table id associated with the subnet.
+ routeTableId: string
+ # Tags is a collection of tags describing the resource.
+ tags: {}
+ # VPC configuration.
+ vpc:
+ # AvailabilityZoneSelection specifies how AZs should be selected if there are more AZs in a region than specified by AvailabilityZoneUsageLimit. There are 2 selection schemes: Ordered - selects based on alphabetical order Random - selects AZs randomly in a region Defaults to Ordered
+ availabilityZoneSelection: "Ordered"
+ # AvailabilityZoneUsageLimit specifies the maximum number of availability zones (AZ) that should be used in a region when automatically creating subnets. If a region has more than this number of AZs then this number of AZs will be picked randomly when creating default subnets. Defaults to 3
+ availabilityZoneUsageLimit: 3
+ # CidrBlock is the CIDR block to be used when the provider creates a managed VPC. Defaults to 10.0.0.0/16.
+ cidrBlock: string
+ # ID is the vpc-id of the VPC this provider should use to create resources.
+ id: string
+ # InternetGatewayID is the id of the internet gateway associated with the VPC.
+ internetGatewayId: string
+ # IPv6 contains ipv6 specific settings for the network. Supported only in managed clusters. This field cannot be set on AWSCluster object.
+ ipv6:
+ # CidrBlock is the CIDR block provided by Amazon when VPC has enabled IPv6.
+ cidrBlock: string
+ # EgressOnlyInternetGatewayID is the id of the egress only internet gateway associated with an IPv6 enabled VPC.
+ egressOnlyInternetGatewayId: string
+ # PoolID is the IP pool which must be defined in case of BYO IP is defined.
+ poolId: string
+ # Tags is a collection of tags describing the resource.
+ tags: {}
+ # The AWS Region the cluster lives in.
+ region: string
+ # S3Bucket contains options to configure a supporting S3 bucket for this cluster - currently used for nodes requiring Ignition (https://coreos.github.io/ignition/) for bootstrapping (requires BootstrapFormatIgnition feature flag to be enabled).
+ s3Bucket:
+ # ControlPlaneIAMInstanceProfile is a name of the IAMInstanceProfile, which will be allowed to read control-plane node bootstrap data from S3 Bucket.
+ controlPlaneIAMInstanceProfile: string
+ # Name defines name of S3 Bucket to be created.
+ name: string
+ # NodesIAMInstanceProfiles is a list of IAM instance profiles, which will be allowed to read worker nodes bootstrap data from S3 Bucket.
+ nodesIAMInstanceProfiles: ["string"]
+ # SSHKeyName is the name of the ssh key to attach to the bastion host. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name)
+ sshKeyName: string
+# AWSClusterStatus defines the observed state of AWSCluster.
+status:
+ # Instance describes an AWS instance.
+ bastion:
+ # Addresses contains the AWS instance associated addresses.
+ addresses:
+ - address: string
+ # Machine address type, one of Hostname, ExternalIP or InternalIP.
+ type: string
+ # Availability zone of instance
+ availabilityZone: string
+ # Indicates whether the instance is optimized for Amazon EBS I/O.
+ ebsOptimized: true
+ # Specifies whether enhanced networking with ENA is enabled.
+ enaSupport: true
+ # The name of the IAM instance profile associated with the instance, if applicable.
+ iamProfile: string
+ id: string
+ # The ID of the AMI used to launch the instance.
+ imageId: string
+ # The current state of the instance.
+ instanceState: string
+ # Specifies ENIs attached to instance
+ networkInterfaces: ["string"]
+ # Configuration options for the non root storage volumes.
+ nonRootVolumes:
+ - deviceName: string
+ # Encrypted is whether the volume should be encrypted or not.
+ encrypted: true
+ # EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller.
+ encryptionKey: string
+ # IOPS is the number of IOPS requested for the disk. Not applicable to all types.
+ iops: 1
+ # Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater).
+ size: 1
+ # Throughput to provision in MiB/s supported for the volume type. Not applicable to all types.
+ throughput: 1
+ # Type is the type of the volume (e.g. gp2, io1, etc...).
+ type: string
+ # The private IPv4 address assigned to the instance.
+ privateIp: string
+ # The public IPv4 address assigned to the instance, if applicable.
+ publicIp: string
+ # Configuration options for the root storage volume.
+ rootVolume:
+ # Device name
+ deviceName: string
+ # Encrypted is whether the volume should be encrypted or not.
+ encrypted: true
+ # EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller.
+ encryptionKey: string
+ # IOPS is the number of IOPS requested for the disk. Not applicable to all types.
+ iops: 1
+ # Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater).
+ size: 1
+ # Throughput to provision in MiB/s supported for the volume type. Not applicable to all types.
+ throughput: 1
+ # Type is the type of the volume (e.g. gp2, io1, etc...).
+ type: string
+ # SecurityGroupIDs are one or more security group IDs this instance belongs to.
+ securityGroupIds: ["string"]
+ # SpotMarketOptions option for configuring instances to be run using AWS Spot instances.
+ spotMarketOptions:
+ # MaxPrice defines the maximum price the user is willing to pay for Spot VM instances
+ maxPrice: string
+ # The name of the SSH key pair.
+ sshKeyName: string
+ # The ID of the subnet of the instance.
+ subnetId: string
+ # The tags associated with the instance.
+ tags: {}
+ # Tenancy indicates if instance should run on shared or single-tenant hardware.
+ tenancy: string
+ # The instance type.
+ type: string
+ # UserData is the raw data script passed to the instance which is run upon bootstrap. This field must not be base64 encoded and should only be used when running a new instance.
+ userData: string
+ # IDs of the instance's volumes
+ volumeIDs: ["string"]
+ # Conditions provide observations of the operational state of a Cluster API resource.
+ conditions:
+ - lastTransitionTime: string
+ # A human readable message indicating details about the transition. This field may be empty.
+ message: string
+ # The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty.
+ reason: string
+ # Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False.
+ severity: string
+ # Status of the condition, one of True, False, Unknown.
+ status: string
+ # 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.
+ type: string
+ # FailureDomains is a slice of FailureDomains.
+ failureDomains:
+ # Attributes is a free form map of attributes an infrastructure provider might use or require.
+ attributes: {}
+ # ControlPlane determines if this failure domain is suitable for use by control plane machines.
+ controlPlane: true
+ # NetworkStatus encapsulates AWS networking resources.
+ networkStatus:
+ # APIServerELB is the Kubernetes api server classic load balancer.
+ apiServerElb:
+ # Attributes defines extra attributes associated with the load balancer.
+ attributes:
+ # CrossZoneLoadBalancing enables the classic load balancer load balancing.
+ crossZoneLoadBalancing: true
+ # IdleTimeout is time that the connection is allowed to be idle (no data has been sent over the connection) before it is closed by the load balancer.
+ idleTimeout: 1
+ # AvailabilityZones is an array of availability zones in the VPC attached to the load balancer.
+ availabilityZones: ["string"]
+ # DNSName is the dns name of the load balancer.
+ dnsName: string
+ # HealthCheck is the classic elb health check associated with the load balancer.
+ healthChecks:
+ healthyThreshold: 1
+ # A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years.
+ interval: 1
+ target: string
+ # A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years.
+ timeout: 1
+ unhealthyThreshold: 1
+ # Listeners is an array of classic elb listeners associated with the load balancer. There must be at least one.
+ listeners:
+ - instancePort: 1
+ # ClassicELBProtocol defines listener protocols for a classic load balancer.
+ instanceProtocol: string
+ port: 1
+ # ClassicELBProtocol defines listener protocols for a classic load balancer.
+ protocol: string
+ # The name of the load balancer. It must be unique within the set of load balancers defined in the region. It also serves as identifier.
+ name: string
+ # Scheme is the load balancer scheme, either internet-facing or private.
+ scheme: string
+ # SecurityGroupIDs is an array of security groups assigned to the load balancer.
+ securityGroupIds: ["string"]
+ # SubnetIDs is an array of subnets in the VPC attached to the load balancer.
+ subnetIds: ["string"]
+ # Tags is a map of tags associated with the load balancer.
+ tags: {}
+ # SecurityGroups is a map from the role/kind of the security group to its unique name, if any.
+ securityGroups:
+ # ID is a unique identifier.
+ id: string
+ # IngressRules is the inbound rules associated with the security group.
+ ingressRule:
+ - cidrBlocks: ["string"]
+ description: string
+ fromPort: 1
+ # List of IPv6 CIDR blocks to allow access from. Cannot be specified with SourceSecurityGroupID.
+ ipv6CidrBlocks: ["string"]
+ # SecurityGroupProtocol defines the protocol type for a security group rule.
+ protocol: string
+ # The security group id to allow access from. Cannot be specified with CidrBlocks.
+ sourceSecurityGroupIds: ["string"]
+ toPort: 1
+ # Name is the security group name.
+ name: string
+ # Tags is a map of tags associated with the security group.
+ tags: {}
+ ready: false
+
+ 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
+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
+AWSClusterSpec defines the desired state of an EC2-based Kubernetes cluster.
+AdditionalTags is an optional set of tags to add to AWS resources managed by the AWS provider, in addition to the ones added by default.
+Bastion contains options to configure the bastion host.
+AllowedCIDRBlocks is a list of CIDR blocks allowed to access the bastion host. They are set as ingress rules for the Bastion host's Security Group (defaults to 0.0.0.0/0).
+AMI will use the specified AMI to boot the bastion. If not specified, the AMI will default to one picked out in public space.
+DisableIngressRules will ensure there are no Ingress rules in the bastion host's security group. Requires AllowedCIDRBlocks to be empty.
+Enabled allows this provider to create a bastion host instance with a public ip to access the VPC private network.
+InstanceType will use the specified instance type for the bastion. If not specified, Cluster API Provider AWS will use t3.micro for all regions except us-east-1, where t2.micro will be the default.
+ControlPlaneEndpoint represents the endpoint used to communicate with the control plane.
+The hostname on which the API server is serving.
+The port on which the API server is serving.
+ControlPlaneLoadBalancer is optional configuration for customizing control plane behavior.
+AdditionalSecurityGroups sets the security groups used by the load balancer. Expected to be security group IDs This is optional - if not provided new security groups will be created for the load balancer
+CrossZoneLoadBalancing enables the classic ELB cross availability zone balancing. + With cross-zone load balancing, each load balancer node for your Classic Load Balancer distributes requests evenly across the registered instances in all enabled Availability Zones. If cross-zone load balancing is disabled, each load balancer node distributes requests evenly across the registered instances in its Availability Zone only. + Defaults to false.
+HealthCheckProtocol sets the protocol type for classic ELB health check target default value is ClassicELBProtocolSSL
+Name sets the name of the classic ELB load balancer. As per AWS, the name must be unique within your set of load balancers for the region, must have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and cannot begin or end with a hyphen. Once set, the value cannot be changed.
+Scheme sets the scheme of the load balancer (defaults to internet-facing)
+Subnets sets the subnets that should be applied to the control plane load balancer (defaults to discovered subnets for managed VPCs or an empty set for unmanaged VPCs)
+IdentityRef is a reference to a identity to be used when reconciling this cluster
+Kind of the identity.
+Name of the identity.
+ImageLookupBaseOS is the name of the base operating system used to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupBaseOS.
+ImageLookupFormat is the AMI naming format to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/
+ImageLookupOrg is the AWS Organization ID to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg.
+NetworkSpec encapsulates all things related to AWS network.
+CNI configuration
+CNIIngressRules specify rules to apply to control plane and worker node security groups. The source for the rule will be set to control plane and worker security group IDs.
+SecurityGroupProtocol defines the protocol type for a security group rule.
+SecurityGroupOverrides is an optional set of security groups to use for cluster instances This is optional - if not provided new security groups will be created for the cluster
+Subnets configuration.
+AvailabilityZone defines the availability zone to use for this subnet in the cluster's region.
+CidrBlock is the CIDR block to be used when the provider creates a managed VPC.
+ID defines a unique identifier to reference this resource.
+IPv6CidrBlock is the IPv6 CIDR block to be used when the provider creates a managed VPC. A subnet can have an IPv4 and an IPv6 address. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object.
+IsIPv6 defines the subnet as an IPv6 subnet. A subnet is IPv6 when it is associated with a VPC that has IPv6 enabled. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object.
+IsPublic defines the subnet as a public subnet. A subnet is public when it is associated with a route table that has a route to an internet gateway.
+NatGatewayID is the NAT gateway id associated with the subnet. Ignored unless the subnet is managed by the provider, in which case this is set on the public subnet where the NAT gateway resides. It is then used to determine routes for private subnets in the same AZ as the public subnet.
+RouteTableID is the routing table id associated with the subnet.
+VPC configuration.
+AvailabilityZoneSelection specifies how AZs should be selected if there are more AZs in a region than specified by AvailabilityZoneUsageLimit. There are 2 selection schemes: Ordered - selects based on alphabetical order Random - selects AZs randomly in a region Defaults to Ordered
+AvailabilityZoneUsageLimit specifies the maximum number of availability zones (AZ) that should be used in a region when automatically creating subnets. If a region has more than this number of AZs then this number of AZs will be picked randomly when creating default subnets. Defaults to 3
+CidrBlock is the CIDR block to be used when the provider creates a managed VPC. Defaults to 10.0.0.0/16.
+ID is the vpc-id of the VPC this provider should use to create resources.
+InternetGatewayID is the id of the internet gateway associated with the VPC.
+IPv6 contains ipv6 specific settings for the network. Supported only in managed clusters. This field cannot be set on AWSCluster object.
+CidrBlock is the CIDR block provided by Amazon when VPC has enabled IPv6.
+EgressOnlyInternetGatewayID is the id of the egress only internet gateway associated with an IPv6 enabled VPC.
+PoolID is the IP pool which must be defined in case of BYO IP is defined.
+The AWS Region the cluster lives in.
+S3Bucket contains options to configure a supporting S3 bucket for this cluster - currently used for nodes requiring Ignition (https://coreos.github.io/ignition/) for bootstrapping (requires BootstrapFormatIgnition feature flag to be enabled).
+ControlPlaneIAMInstanceProfile is a name of the IAMInstanceProfile, which will be allowed to read control-plane node bootstrap data from S3 Bucket.
+Name defines name of S3 Bucket to be created.
+NodesIAMInstanceProfiles is a list of IAM instance profiles, which will be allowed to read worker nodes bootstrap data from S3 Bucket.
+SSHKeyName is the name of the ssh key to attach to the bastion host. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name)
+AWSClusterStatus defines the observed state of AWSCluster.
+Instance describes an AWS instance.
+Addresses contains the AWS instance associated addresses.
+The machine address.
+Machine address type, one of Hostname, ExternalIP or InternalIP.
+Availability zone of instance
+Indicates whether the instance is optimized for Amazon EBS I/O.
+Specifies whether enhanced networking with ENA is enabled.
+The name of the IAM instance profile associated with the instance, if applicable.
+The ID of the AMI used to launch the instance.
+The current state of the instance.
+Specifies ENIs attached to instance
+Configuration options for the non root storage volumes.
+Device name
+Encrypted is whether the volume should be encrypted or not.
+EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller.
+IOPS is the number of IOPS requested for the disk. Not applicable to all types.
+Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater).
+Throughput to provision in MiB/s supported for the volume type. Not applicable to all types.
+Type is the type of the volume (e.g. gp2, io1, etc...).
+The private IPv4 address assigned to the instance.
+The public IPv4 address assigned to the instance, if applicable.
+Configuration options for the root storage volume.
+Device name
+Encrypted is whether the volume should be encrypted or not.
+EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller.
+IOPS is the number of IOPS requested for the disk. Not applicable to all types.
+Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater).
+Throughput to provision in MiB/s supported for the volume type. Not applicable to all types.
+Type is the type of the volume (e.g. gp2, io1, etc...).
+SecurityGroupIDs are one or more security group IDs this instance belongs to.
+SpotMarketOptions option for configuring instances to be run using AWS Spot instances.
+MaxPrice defines the maximum price the user is willing to pay for Spot VM instances
+The name of the SSH key pair.
+The ID of the subnet of the instance.
+Tenancy indicates if instance should run on shared or single-tenant hardware.
+The instance type.
+UserData is the raw data script passed to the instance which is run upon bootstrap. This field must not be base64 encoded and should only be used when running a new instance.
+IDs of the instance's volumes
+Conditions provide observations of the operational state of a Cluster API resource.
+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.
+A human readable message indicating details about the transition. This field may be empty.
+The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty.
+Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False.
+Status of the condition, one of True, False, Unknown.
+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.
+FailureDomains is a slice of FailureDomains.
+Attributes is a free form map of attributes an infrastructure provider might use or require.
+ControlPlane determines if this failure domain is suitable for use by control plane machines.
+NetworkStatus encapsulates AWS networking resources.
+APIServerELB is the Kubernetes api server classic load balancer.
+Attributes defines extra attributes associated with the load balancer.
+CrossZoneLoadBalancing enables the classic load balancer load balancing.
+IdleTimeout is time that the connection is allowed to be idle (no data has been sent over the connection) before it is closed by the load balancer.
+AvailabilityZones is an array of availability zones in the VPC attached to the load balancer.
+DNSName is the dns name of the load balancer.
+HealthCheck is the classic elb health check associated with the load balancer.
+A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years.
+A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years.
+Listeners is an array of classic elb listeners associated with the load balancer. There must be at least one.
+ClassicELBProtocol defines listener protocols for a classic load balancer.
+ClassicELBProtocol defines listener protocols for a classic load balancer.
+The name of the load balancer. It must be unique within the set of load balancers defined in the region. It also serves as identifier.
+Scheme is the load balancer scheme, either internet-facing or private.
+SecurityGroupIDs is an array of security groups assigned to the load balancer.
+SubnetIDs is an array of subnets in the VPC attached to the load balancer.
+SecurityGroups is a map from the role/kind of the security group to its unique name, if any.
+ID is a unique identifier.
+IngressRules is the inbound rules associated with the security group.
+List of CIDR blocks to allow access from. Cannot be specified with SourceSecurityGroupID.
+List of IPv6 CIDR blocks to allow access from. Cannot be specified with SourceSecurityGroupID.
+SecurityGroupProtocol defines the protocol type for a security group rule.
+The security group id to allow access from. Cannot be specified with CidrBlocks.
+Name is the security group name.
+G^gm6kYBb*a12$zH_!ZqQBa7(x&+!G!MkAx?}GvS5s
zN_ZoDA-og3h~7jWqA$^p=uZqF1`>ma!Nd?^C^3u}PK+Q%5~GOG#28{MF^(8dOduu_
zlZeU06k;kdjhIf%AZ8M?h}py(VlFX{m`^Mq77~ky#l#X~DY1-LPOKnS603;S#2R8P
zv5r_zY#=rgn~2TC7Gf*0jo41?Aa)YFh~2~ 7S;JU4%2PKkLO1=psQO><}U^0OWLxGCUF;*71
z4;6V8$S{+zgWxVxYusOw?~2^?Bp<{ms0-+0K|oW&)jn_2!9)CG{%*{C3}cecTdsjw
z#l#1J6+pfHitKU?*qsz?Dtq};p%v9|e^kJ2IoKgh4Qe0KP_Ry?MA!77HoP(niI9LS
zqSv>j6o$>eBu5X?xK=Ca!3{h-9~%njbf|R==qdoR9`ePD!uf#5M9~@G3UykNaww=i_9Q$a6JnKqc#BBh_N&z_%+)dr
zhj(;1Ca2obp{Op-2+;0s^7#g1(8NjM&urOQ<9T@NYy%O(-Cgo@u7^!ua*5m`BmDqk
z|Nh0)?vtl