From 1450306642f91aca7ffb145cd2a412c37897f450 Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Wed, 15 Nov 2017 11:33:20 +0800 Subject: [PATCH 01/45] Improve docs related to kubectl --- docs/tasks/configure-pod-container/configmap.md | 4 +++- docs/user-guide/kubectl-overview.md | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/tasks/configure-pod-container/configmap.md b/docs/tasks/configure-pod-container/configmap.md index e77248b191..d31ea8f978 100644 --- a/docs/tasks/configure-pod-container/configmap.md +++ b/docs/tasks/configure-pod-container/configmap.md @@ -36,7 +36,9 @@ The data source corresponds to a key-value pair in the ConfigMap, where * key = the file name or the key you provided on the command line, and * value = the file contents or the literal value you provided on the command line. -You can use [`kubectl describe`](/docs/user-guide/kubectl/{{page.version}}/#describe) or [`kubectl get`](/docs/user-guide/kubectl/{{page.version}}/#get) to retrieve information about a ConfigMap. The former shows a summary of the ConfigMap, while the latter returns the full contents of the ConfigMap. +You can use [`kubectl describe`](/docs/user-guide/kubectl/{{page.version}}/#describe) or +[`kubectl get`](/docs/user-guide/kubectl/{{page.version}}/#get) to retrieve information +about a ConfigMap. ### Create ConfigMaps from directories diff --git a/docs/user-guide/kubectl-overview.md b/docs/user-guide/kubectl-overview.md index 923a99558e..5ae7485c5b 100644 --- a/docs/user-guide/kubectl-overview.md +++ b/docs/user-guide/kubectl-overview.md @@ -264,6 +264,17 @@ $ kubectl describe pods $ kubectl describe pods --include-uninitialized=false ``` +**Note:** The `kubectl get` command is usually used for retrieving one or more +resources of the same resource type. It features a rich set of flags that allows +you to customize the output format using the `-o` or `--output` flag, for example. +You can specify the `-w` or `--watch` flag to start watching updates to a particular +object. The `kubectl describe` command is more focused on describing the many +related aspects of a specified resource. It may invoke several API calls to the +API server to build a view for the user. For example, the `kubectl describe node` +command retrieves not only the information about the node, but also a summary of +the pods running on it, the events generated for the node etc. +{: .note} + `kubectl delete` - Delete resources either from a file, stdin, or specifying label selectors, names, resource selectors, or resources. ```shell From 446b9cb33556abb663c02554153e80dfc531d79a Mon Sep 17 00:00:00 2001 From: Abhinav Sinha Date: Wed, 15 Nov 2017 18:31:01 +0530 Subject: [PATCH 02/45] Pod priority to be enabled for kubelet The document only mentioned enabling the feature for API and Scheduler but it needs to be enabled for kubelet as well --- docs/concepts/configuration/pod-priority-preemption.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/concepts/configuration/pod-priority-preemption.md b/docs/concepts/configuration/pod-priority-preemption.md index ce30c79c67..fa7dbc54ee 100644 --- a/docs/concepts/configuration/pod-priority-preemption.md +++ b/docs/concepts/configuration/pod-priority-preemption.md @@ -39,8 +39,7 @@ The following sections provide more information about these steps. ## Enabling priority and preemption Pod priority and preemption is disabled by default in Kubernetes 1.8. -To enable the feature, set this command-line flag for the API server -and the scheduler: +To enable the feature, set this command-line flag for the API server,scheduler and kubelet: ``` --feature-gates=PodPriority=true From 05af66ef77a3fc7464687139d7b6963f2e9b540b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=87=E6=85=95?= Date: Tue, 17 Oct 2017 10:11:59 +0800 Subject: [PATCH 03/45] update hostport doc --- docs/concepts/configuration/overview.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/concepts/configuration/overview.md b/docs/concepts/configuration/overview.md index f9151eca8c..27fbc350eb 100644 --- a/docs/concepts/configuration/overview.md +++ b/docs/concepts/configuration/overview.md @@ -45,7 +45,9 @@ This is a living document. If you think of something that is not on this list bu 2. Create a service; 3. Then scale up the replication controller. -- Don't use `hostPort` unless it is absolutely necessary (for example: for a node daemon). It specifies the port number to expose on the host. When you bind a Pod to a `hostPort`, there are a limited number of places to schedule a pod due to port conflicts— you can only schedule as many such Pods as there are nodes in your Kubernetes cluster. +- Don't use `hostPort` unless it is absolutely necessary (for example: for a node daemon). It specifies the port number to expose on the host. When you bind a Pod to a `hostPort`, there are a limited number of places to schedule a pod due to port conflicts. The conflict comes from being limited to a single `hostIP:hostPort:protocol` combination. Different `hostIP:hostPort:protocol` combinations mean different requirements. For example, a pod that binds tcp 80 host port on 127.0.0.1 does not conflict with another pod that binds tcp 80 port on 127.0.0.2. + + Special notes on hostIP and protocol, if you don't specify the hostIP and protocol explicitly, kubernetes will give you 0.0.0.0 and tcp as default hostIP and protocol. And "0.0.0.0" is a wildcard hostIP that will occupy all <_,hostPort,protocol> on the node the pod is scheduled on. Specifically, it will occupy all for all IPs on the host. If you only need access to the port for debugging purposes, you can use the [kubectl proxy and apiserver proxy](/docs/tasks/access-kubernetes-api/http-proxy-access-api/) or [kubectl port-forward](/docs/tasks/access-application-cluster/port-forward-access-application-cluster/). You can use a [Service](/docs/concepts/services-networking/service/) object for external service access. From 711ce0ce5cb842558b9710f52341eb17240cbc25 Mon Sep 17 00:00:00 2001 From: Tom Denham Date: Thu, 16 Nov 2017 10:55:17 -0700 Subject: [PATCH 04/45] Update flannel to version v0.9.1 This includes a single fix to improve compatibility with later versions of Docker. Release note: https://github.com/coreos/flannel/releases/tag/v0.9.1 --- docs/setup/independent/create-cluster-kubeadm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/setup/independent/create-cluster-kubeadm.md b/docs/setup/independent/create-cluster-kubeadm.md index 38aa122f2a..9abd872e00 100644 --- a/docs/setup/independent/create-cluster-kubeadm.md +++ b/docs/setup/independent/create-cluster-kubeadm.md @@ -271,7 +271,7 @@ to pass bridged IPv4 traffic to iptables' chains. This is a requirement for some please see [here](https://kubernetes.io/docs/concepts/cluster-administration/network-plugins/#network-plugin-requirements). ```shell -kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.0/Documentation/kube-flannel.yml +kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml ``` {% endcapture %} From 582a59e024b54368854e5b1bb8df790e2e114b2e Mon Sep 17 00:00:00 2001 From: Suraj Deshmukh Date: Mon, 20 Nov 2017 17:05:42 +0530 Subject: [PATCH 05/45] (distribute creds securely): change file name to links --- .../distribute-credentials-secure.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/tasks/inject-data-application/distribute-credentials-secure.md b/docs/tasks/inject-data-application/distribute-credentials-secure.md index c85532fe86..b48f22ab97 100644 --- a/docs/tasks/inject-data-application/distribute-credentials-secure.md +++ b/docs/tasks/inject-data-application/distribute-credentials-secure.md @@ -37,7 +37,7 @@ username and password: 1. Create the Secret - kubectl create -f secret.yaml + kubectl create -f https://k8s.io/docs/tasks/inject-data-application/secret.yaml **Note:** If you want to skip the Base64 encoding step, you can create a Secret by using the `kubectl create secret` command: @@ -81,7 +81,7 @@ Here is a configuration file you can use to create a Pod: 1. Create the Pod: - kubectl create -f secret-pod.yaml + kubectl create -f https://k8s.io/docs/tasks/inject-data-application/secret-pod.yaml 1. Verify that your Pod is running: @@ -128,7 +128,7 @@ Here is a configuration file you can use to create a Pod: 1. Create the Pod: - kubectl create -f secret-envars-pod.yaml + kubectl create -f https://k8s.io/docs/tasks/inject-data-application/secret-envars-pod.yaml 1. Verify that your Pod is running: From af064f5ce350ec002e086740b4f40c98ce017216 Mon Sep 17 00:00:00 2001 From: Suraj Deshmukh Date: Mon, 20 Nov 2017 18:39:16 +0530 Subject: [PATCH 06/45] fix PodPreset manifests Update the image in PodPreset manifest to use the real image, also removed the hard-coded namespace in manifest. --- .../inject-data-application/podpreset-allow-db-merged.yaml | 2 +- docs/tasks/inject-data-application/podpreset-allow-db.yaml | 1 - docs/tasks/inject-data-application/podpreset-conflict-pod.yaml | 2 +- .../inject-data-application/podpreset-conflict-preset.yaml | 1 - docs/tasks/inject-data-application/podpreset-merged.yaml | 2 +- docs/tasks/inject-data-application/podpreset-multi-merged.yaml | 2 +- docs/tasks/inject-data-application/podpreset-pod.yaml | 2 +- docs/tasks/inject-data-application/podpreset-preset.yaml | 1 - docs/tasks/inject-data-application/podpreset-proxy.yaml | 1 - 9 files changed, 5 insertions(+), 9 deletions(-) diff --git a/docs/tasks/inject-data-application/podpreset-allow-db-merged.yaml b/docs/tasks/inject-data-application/podpreset-allow-db-merged.yaml index 73d93312fa..0cf950c803 100644 --- a/docs/tasks/inject-data-application/podpreset-allow-db-merged.yaml +++ b/docs/tasks/inject-data-application/podpreset-allow-db-merged.yaml @@ -10,7 +10,7 @@ metadata: spec: containers: - name: website - image: ecorp/website + image: nginx volumeMounts: - mountPath: /cache name: cache-volume diff --git a/docs/tasks/inject-data-application/podpreset-allow-db.yaml b/docs/tasks/inject-data-application/podpreset-allow-db.yaml index 96f6dbfe20..97203fdb9c 100644 --- a/docs/tasks/inject-data-application/podpreset-allow-db.yaml +++ b/docs/tasks/inject-data-application/podpreset-allow-db.yaml @@ -2,7 +2,6 @@ apiVersion: settings.k8s.io/v1alpha1 kind: PodPreset metadata: name: allow-database - namespace: myns spec: selector: matchLabels: diff --git a/docs/tasks/inject-data-application/podpreset-conflict-pod.yaml b/docs/tasks/inject-data-application/podpreset-conflict-pod.yaml index 9061b9f5e8..cf201b2f06 100644 --- a/docs/tasks/inject-data-application/podpreset-conflict-pod.yaml +++ b/docs/tasks/inject-data-application/podpreset-conflict-pod.yaml @@ -8,7 +8,7 @@ metadata: spec: containers: - name: website - image: ecorp/website + image: nginx volumeMounts: - mountPath: /cache name: cache-volume diff --git a/docs/tasks/inject-data-application/podpreset-conflict-preset.yaml b/docs/tasks/inject-data-application/podpreset-conflict-preset.yaml index ab70b14d28..a2ad96c48a 100644 --- a/docs/tasks/inject-data-application/podpreset-conflict-preset.yaml +++ b/docs/tasks/inject-data-application/podpreset-conflict-preset.yaml @@ -2,7 +2,6 @@ apiVersion: settings.k8s.io/v1alpha1 kind: PodPreset metadata: name: allow-database - namespace: myns spec: selector: matchLabels: diff --git a/docs/tasks/inject-data-application/podpreset-merged.yaml b/docs/tasks/inject-data-application/podpreset-merged.yaml index 0a5dfce0b5..97c022c86c 100644 --- a/docs/tasks/inject-data-application/podpreset-merged.yaml +++ b/docs/tasks/inject-data-application/podpreset-merged.yaml @@ -10,7 +10,7 @@ metadata: spec: containers: - name: website - image: ecorp/website + image: nginx volumeMounts: - mountPath: /cache name: cache-volume diff --git a/docs/tasks/inject-data-application/podpreset-multi-merged.yaml b/docs/tasks/inject-data-application/podpreset-multi-merged.yaml index dd6a7197ef..7fcaae62e3 100644 --- a/docs/tasks/inject-data-application/podpreset-multi-merged.yaml +++ b/docs/tasks/inject-data-application/podpreset-multi-merged.yaml @@ -11,7 +11,7 @@ metadata: spec: containers: - name: website - image: ecorp/website + image: nginx volumeMounts: - mountPath: /cache name: cache-volume diff --git a/docs/tasks/inject-data-application/podpreset-pod.yaml b/docs/tasks/inject-data-application/podpreset-pod.yaml index 82c590a924..b6b4e60d6e 100644 --- a/docs/tasks/inject-data-application/podpreset-pod.yaml +++ b/docs/tasks/inject-data-application/podpreset-pod.yaml @@ -8,7 +8,7 @@ metadata: spec: containers: - name: website - image: ecorp/website + image: nginx ports: - containerPort: 80 diff --git a/docs/tasks/inject-data-application/podpreset-preset.yaml b/docs/tasks/inject-data-application/podpreset-preset.yaml index c5d34437f2..f300289c82 100644 --- a/docs/tasks/inject-data-application/podpreset-preset.yaml +++ b/docs/tasks/inject-data-application/podpreset-preset.yaml @@ -2,7 +2,6 @@ apiVersion: settings.k8s.io/v1alpha1 kind: PodPreset metadata: name: allow-database - namespace: myns spec: selector: matchLabels: diff --git a/docs/tasks/inject-data-application/podpreset-proxy.yaml b/docs/tasks/inject-data-application/podpreset-proxy.yaml index 20dab81f36..d854475ac2 100644 --- a/docs/tasks/inject-data-application/podpreset-proxy.yaml +++ b/docs/tasks/inject-data-application/podpreset-proxy.yaml @@ -2,7 +2,6 @@ apiVersion: settings.k8s.io/v1alpha1 kind: PodPreset metadata: name: proxy - namespace: myns spec: selector: matchLabels: From 5e7e5f323554c710b7664a3382ad9cf0b2ea31c9 Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Tue, 21 Nov 2017 16:22:55 +0800 Subject: [PATCH 07/45] Add more files for schema test --- .../controllers/garbage-collection.md | 2 +- docs/admin/daemon.yaml | 18 -- .../high-availability/kube-scheduler.yaml | 3 - docs/admin/multiple-schedulers/pod1.yaml | 2 +- .../abstractions/controllers/my-repset.yaml | 17 -- .../abstractions/nginx-deployment.yaml | 16 -- .../nginx-deployment.yaml | 3 + .../controllers/garbage-collection.md | 2 +- test/examples_test.go | 196 ++++++++++++------ 9 files changed, 133 insertions(+), 126 deletions(-) delete mode 100644 docs/admin/daemon.yaml delete mode 100644 docs/concepts/abstractions/controllers/my-repset.yaml delete mode 100644 docs/concepts/abstractions/nginx-deployment.yaml diff --git a/cn/docs/concepts/workloads/controllers/garbage-collection.md b/cn/docs/concepts/workloads/controllers/garbage-collection.md index 1d8a921490..c9af3905b7 100644 --- a/cn/docs/concepts/workloads/controllers/garbage-collection.md +++ b/cn/docs/concepts/workloads/controllers/garbage-collection.md @@ -45,7 +45,7 @@ Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经 如果创建该 ReplicaSet,然后查看 Pod 的 metadata 字段,能够看到 OwnerReferences 字段: ```shell -kubectl create -f https://k8s.io/docs/concepts/abstractions/controllers/my-repset.yaml +kubectl create -f https://k8s.io/docs/concepts/controllers/my-repset.yaml kubectl get pods --output=yaml ``` diff --git a/docs/admin/daemon.yaml b/docs/admin/daemon.yaml deleted file mode 100644 index c5cd14a592..0000000000 --- a/docs/admin/daemon.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: DaemonSet -metadata: - name: prometheus-node-exporter -spec: - template: - metadata: - name: prometheus-node-exporter - labels: - daemon: prom-node-exp - spec: - containers: - - name: c - image: prom/prometheus - ports: - - containerPort: 9090 - hostPort: 9090 - name: serverport diff --git a/docs/admin/high-availability/kube-scheduler.yaml b/docs/admin/high-availability/kube-scheduler.yaml index 9e997cbc47..40c863da48 100644 --- a/docs/admin/high-availability/kube-scheduler.yaml +++ b/docs/admin/high-availability/kube-scheduler.yaml @@ -21,9 +21,6 @@ spec: volumeMounts: - mountPath: /var/log/kube-scheduler.log name: logfile - - mountPath: /var/run/secrets/kubernetes.io/serviceaccount - name: default-token-s8ejd - readOnly: true volumes: - hostPath: path: /var/log/kube-scheduler.log diff --git a/docs/admin/multiple-schedulers/pod1.yaml b/docs/admin/multiple-schedulers/pod1.yaml index 733aa97d99..6cf8fec25a 100644 --- a/docs/admin/multiple-schedulers/pod1.yaml +++ b/docs/admin/multiple-schedulers/pod1.yaml @@ -7,4 +7,4 @@ metadata: spec: containers: - name: pod-with-no-annotation-container - image: gcr.io/google_containers/pause:2.0 \ No newline at end of file + image: gcr.io/google_containers/pause:2.0 diff --git a/docs/concepts/abstractions/controllers/my-repset.yaml b/docs/concepts/abstractions/controllers/my-repset.yaml deleted file mode 100644 index 54befd8f9d..0000000000 --- a/docs/concepts/abstractions/controllers/my-repset.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: ReplicaSet -metadata: - name: my-repset -spec: - replicas: 3 - selector: - matchLabels: - pod-is-for: garbage-collection-example - template: - metadata: - labels: - pod-is-for: garbage-collection-example - spec: - containers: - - name: nginx - image: nginx diff --git a/docs/concepts/abstractions/nginx-deployment.yaml b/docs/concepts/abstractions/nginx-deployment.yaml deleted file mode 100644 index 2aabf5e7b1..0000000000 --- a/docs/concepts/abstractions/nginx-deployment.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: apps/v1beta1 -kind: Deployment -metadata: - name: nginx-deployment -spec: - replicas: 3 - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - image: nginx:1.7.9 - ports: - - containerPort: 80 diff --git a/docs/concepts/overview/working-with-objects/nginx-deployment.yaml b/docs/concepts/overview/working-with-objects/nginx-deployment.yaml index 8925d1b08d..4139bd1ac1 100644 --- a/docs/concepts/overview/working-with-objects/nginx-deployment.yaml +++ b/docs/concepts/overview/working-with-objects/nginx-deployment.yaml @@ -4,6 +4,9 @@ metadata: name: nginx-deployment spec: replicas: 3 + selector: + matchLabels: + app: nginx template: metadata: labels: diff --git a/docs/concepts/workloads/controllers/garbage-collection.md b/docs/concepts/workloads/controllers/garbage-collection.md index b220a17cdd..2f83cc87ab 100644 --- a/docs/concepts/workloads/controllers/garbage-collection.md +++ b/docs/concepts/workloads/controllers/garbage-collection.md @@ -40,7 +40,7 @@ If you create the ReplicaSet and then view the Pod metadata, you can see OwnerReferences field: ```shell -kubectl create -f https://k8s.io/docs/concepts/abstractions/controllers/my-repset.yaml +kubectl create -f https://k8s.io/docs/concepts/controllers/my-repset.yaml kubectl get pods --output=yaml ``` diff --git a/test/examples_test.go b/test/examples_test.go index be88ff908f..87b7e9a54a 100644 --- a/test/examples_test.go +++ b/test/examples_test.go @@ -32,15 +32,17 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apimachinery/pkg/util/yaml" - api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apis/core/validation" "k8s.io/kubernetes/pkg/apis/apps" apps_validation "k8s.io/kubernetes/pkg/apis/apps/validation" + "k8s.io/kubernetes/pkg/apis/autoscaling" + autoscaling_validation "k8s.io/kubernetes/pkg/apis/autoscaling/validation" "k8s.io/kubernetes/pkg/apis/batch" batch_validation "k8s.io/kubernetes/pkg/apis/batch/validation" + api "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/apis/core/validation" "k8s.io/kubernetes/pkg/apis/extensions" - expvalidation "k8s.io/kubernetes/pkg/apis/extensions/validation" + ext_validation "k8s.io/kubernetes/pkg/apis/extensions/validation" "k8s.io/kubernetes/pkg/apis/policy" policyvalidation "k8s.io/kubernetes/pkg/apis/policy/validation" "k8s.io/kubernetes/pkg/apis/storage" @@ -113,11 +115,21 @@ func validateObject(obj runtime.Object) (errors field.ErrorList) { t.Namespace = api.NamespaceDefault } errors = validation.ValidateResourceQuota(t) + case *autoscaling.HorizontalPodAutoscaler: + if t.Namespace == "" { + t.Namespace = api.NamespaceDefault + } + errors = autoscaling_validation.ValidateHorizontalPodAutoscaler(t) case *extensions.Deployment: if t.Namespace == "" { t.Namespace = api.NamespaceDefault } - errors = expvalidation.ValidateDeployment(t) + errors = ext_validation.ValidateDeployment(t) + case *extensions.ReplicaSet: + if t.Namespace == "" { + t.Namespace = api.NamespaceDefault + } + errors = ext_validation.ValidateReplicaSet(t) case *batch.Job: if t.Namespace == "" { t.Namespace = api.NamespaceDefault @@ -130,14 +142,14 @@ func validateObject(obj runtime.Object) (errors field.ErrorList) { if t.Namespace == "" { t.Namespace = api.NamespaceDefault } - errors = expvalidation.ValidateIngress(t) + errors = ext_validation.ValidateIngress(t) case *extensions.DaemonSet: if t.Namespace == "" { t.Namespace = api.NamespaceDefault } - errors = expvalidation.ValidateDaemonSet(t) + errors = ext_validation.ValidateDaemonSet(t) case *extensions.PodSecurityPolicy: - errors = expvalidation.ValidatePodSecurityPolicy(t) + errors = ext_validation.ValidatePodSecurityPolicy(t) case *batch.CronJob: if t.Namespace == "" { t.Namespace = api.NamespaceDefault @@ -218,45 +230,76 @@ func walkConfigFiles(inDir string, fn func(name, path string, data [][]byte)) er } func TestExampleObjectSchemas(t *testing.T) { + // Please help maintain the alphabeta order in the map cases := map[string]map[string][]runtime.Object{ - "../docs/user-guide/walkthrough": { - "deployment": {&extensions.Deployment{}}, - "deployment-update": {&extensions.Deployment{}}, - "pod-nginx": {&api.Pod{}}, - "pod-nginx-with-label": {&api.Pod{}}, - "pod-redis": {&api.Pod{}}, - "pod-with-http-healthcheck": {&api.Pod{}}, - "pod-with-tcp-socket-healthcheck": {&api.Pod{}}, - "podtemplate": {&api.PodTemplate{}}, - "service": {&api.Service{}}, + "../docs/admin/high-availability": { + "etcd": {&api.Pod{}}, + "kube-apiserver": {&api.Pod{}}, + "kube-controller-manager": {&api.Pod{}}, + "kube-scheduler": {&api.Pod{}}, + "podmaster": {&api.Pod{}}, }, - "../docs/user-guide/update-demo": { - "kitten-rc": {&api.ReplicationController{}}, - "nautilus-rc": {&api.ReplicationController{}}, + "../docs/admin/limitrange": { + "invalid-pod": {&api.Pod{}}, + "limits": {&api.LimitRange{}}, + "namespace": {&api.Namespace{}}, + "valid-pod": {&api.Pod{}}, + }, + "../docs/admin/multiple-schedulers": { + "my-scheduler": {&extensions.Deployment{}}, + "pod1": {&api.Pod{}}, + "pod2": {&api.Pod{}}, + "pod3": {&api.Pod{}}, + }, + "../docs/admin/namespaces": { + "namespace-dev": {&api.Namespace{}}, + "namespace-prod": {&api.Namespace{}}, + }, + "../docs/admin/resourcequota": { + "best-effort": {&api.ResourceQuota{}}, + "compute-resources": {&api.ResourceQuota{}}, + "limits": {&api.LimitRange{}}, + "namespace": {&api.Namespace{}}, + "not-best-effort": {&api.ResourceQuota{}}, + "object-counts": {&api.ResourceQuota{}}, + }, + "../docs/concepts/cluster-administration": { + "counter-pod": {&api.Pod{}}, + "fluentd-sidecar-config": {&api.ConfigMap{}}, + "nginx-app": {&api.Service{}, &extensions.Deployment{}}, + "two-files-counter-pod": {&api.Pod{}}, + "two-files-counter-pod-agent-sidecar": {&api.Pod{}}, + "two-files-counter-pod-streaming-sidecar": {&api.Pod{}}, + }, + "../docs/concepts/configuration": { + "commands": {&api.Pod{}}, + "pod": {&api.Pod{}}, + "pod-with-node-affinity": {&api.Pod{}}, + "pod-with-pod-affinity": {&api.Pod{}}, + }, + "../docs/concepts/overview/working-with-objects": { + "nginx-deployment": {&extensions.Deployment{}}, }, "../docs/concepts/policy": { "psp": {&extensions.PodSecurityPolicy{}}, }, - "../docs/user-guide/persistent-volumes/volumes": { - "local-01": {&api.PersistentVolume{}}, - "local-02": {&api.PersistentVolume{}}, - "gce": {&api.PersistentVolume{}}, - "nfs": {&api.PersistentVolume{}}, + "../docs/concepts/services-networking": { + "curlpod": {&extensions.Deployment{}}, + "hostaliases-pod": {&api.Pod{}}, + "ingress": {&extensions.Ingress{}}, + "nginx-secure-app": {&api.Service{}, &extensions.Deployment{}}, + "nginx-svc": {&api.Service{}}, + "run-my-nginx": {&extensions.Deployment{}}, }, - "../docs/user-guide/persistent-volumes/claims": { - "claim-01": {&api.PersistentVolumeClaim{}}, - "claim-02": {&api.PersistentVolumeClaim{}}, - "claim-03": {&api.PersistentVolumeClaim{}}, - }, - "../docs/user-guide/persistent-volumes/simpletest": { - "namespace": {&api.Namespace{}}, - "pod": {&api.Pod{}}, - "service": {&api.Service{}}, - }, - "../docs/user-guide/liveness": { - "exec-liveness": {&api.Pod{}}, - "http-liveness": {&api.Pod{}}, - "http-liveness-named-port": {&api.Pod{}}, + "../docs/concepts/workloads/controllers": { + "cronjob": {&batch.CronJob{}}, + "daemonset": {&extensions.DaemonSet{}}, + "frontend": {&extensions.ReplicaSet{}}, + "hpa-rs": {&autoscaling.HorizontalPodAutoscaler{}}, + "job": {&batch.Job{}}, + "my-repset": {&extensions.ReplicaSet{}}, + "nginx-deployment": {&extensions.Deployment{}}, + "replication": {&api.ReplicationController{}}, }, "../docs/tasks/job/coarse-parallel-processing-work-queue": { "job": {&batch.Job{}}, @@ -266,6 +309,18 @@ func TestExampleObjectSchemas(t *testing.T) { "redis-pod": {&api.Pod{}}, "redis-service": {&api.Service{}}, }, + "../docs/tutorials/stateful-application": { + "gce-volume": {&api.PersistentVolume{}}, + "mysql-deployment": {&api.Service{}, &api.PersistentVolumeClaim{}, &extensions.Deployment{}}, + "mysql-services": {&api.Service{}, &api.Service{}}, + "mysql-configmap": {&api.ConfigMap{}}, + "mysql-statefulset": {&apps.StatefulSet{}}, + "cassandra-service": {&api.Service{}}, + "cassandra-statefulset": {&apps.StatefulSet{}, &storage.StorageClass{}}, + "web": {&api.Service{}, &apps.StatefulSet{}}, + "webp": {&api.Service{}, &apps.StatefulSet{}}, + "zookeeper": {&api.Service{}, &api.Service{}, &policy.PodDisruptionBudget{}, &apps.StatefulSet{}}, + }, "../docs/user-guide": { "bad-nginx-deployment": {&extensions.Deployment{}}, "counter-pod": {&api.Pod{}}, @@ -290,9 +345,6 @@ func TestExampleObjectSchemas(t *testing.T) { "run-my-nginx": {&extensions.Deployment{}}, "cronjob": {&batch.CronJob{}}, }, - "../docs/admin": { - "daemon": {&extensions.DaemonSet{}}, - }, "../docs/user-guide/downward-api": { "dapi-pod": {&api.Pod{}}, "dapi-container-resources": {&api.Pod{}}, @@ -301,45 +353,51 @@ func TestExampleObjectSchemas(t *testing.T) { "dapi-volume": {&api.Pod{}}, "dapi-volume-resources": {&api.Pod{}}, }, - "../docs/admin/namespaces": { - "namespace-dev": {&api.Namespace{}}, - "namespace-prod": {&api.Namespace{}}, - }, - "../docs/admin/limitrange": { - "invalid-pod": {&api.Pod{}}, - "limits": {&api.LimitRange{}}, - "namespace": {&api.Namespace{}}, - "valid-pod": {&api.Pod{}}, + "../docs/user-guide/liveness": { + "exec-liveness": {&api.Pod{}}, + "http-liveness": {&api.Pod{}}, + "http-liveness-named-port": {&api.Pod{}}, }, "../docs/user-guide/node-selection": { "pod": {&api.Pod{}}, "pod-with-node-affinity": {&api.Pod{}}, "pod-with-pod-affinity": {&api.Pod{}}, }, - "../docs/admin/resourcequota": { - "best-effort": {&api.ResourceQuota{}}, - "compute-resources": {&api.ResourceQuota{}}, - "limits": {&api.LimitRange{}}, - "namespace": {&api.Namespace{}}, - "not-best-effort": {&api.ResourceQuota{}}, - "object-counts": {&api.ResourceQuota{}}, + "../docs/user-guide/persistent-volumes/volumes": { + "local-01": {&api.PersistentVolume{}}, + "local-02": {&api.PersistentVolume{}}, + "gce": {&api.PersistentVolume{}}, + "nfs": {&api.PersistentVolume{}}, + }, + "../docs/user-guide/persistent-volumes/claims": { + "claim-01": {&api.PersistentVolumeClaim{}}, + "claim-02": {&api.PersistentVolumeClaim{}}, + "claim-03": {&api.PersistentVolumeClaim{}}, + }, + "../docs/user-guide/persistent-volumes/simpletest": { + "namespace": {&api.Namespace{}}, + "pod": {&api.Pod{}}, + "service": {&api.Service{}}, }, "../docs/user-guide/secrets": { "secret-pod": {&api.Pod{}}, "secret": {&api.Secret{}}, "secret-env-pod": {&api.Pod{}}, }, - "../docs/tutorials/stateful-application": { - "gce-volume": {&api.PersistentVolume{}}, - "mysql-deployment": {&api.Service{}, &api.PersistentVolumeClaim{}, &extensions.Deployment{}}, - "mysql-services": {&api.Service{}, &api.Service{}}, - "mysql-configmap": {&api.ConfigMap{}}, - "mysql-statefulset": {&apps.StatefulSet{}}, - "cassandra-service": {&api.Service{}}, - "cassandra-statefulset": {&apps.StatefulSet{}, &storage.StorageClass{}}, - "web": {&api.Service{}, &apps.StatefulSet{}}, - "webp": {&api.Service{}, &apps.StatefulSet{}}, - "zookeeper": {&api.Service{}, &api.Service{}, &policy.PodDisruptionBudget{}, &apps.StatefulSet{}}, + "../docs/user-guide/update-demo": { + "kitten-rc": {&api.ReplicationController{}}, + "nautilus-rc": {&api.ReplicationController{}}, + }, + "../docs/user-guide/walkthrough": { + "deployment": {&extensions.Deployment{}}, + "deployment-update": {&extensions.Deployment{}}, + "pod-nginx": {&api.Pod{}}, + "pod-nginx-with-label": {&api.Pod{}}, + "pod-redis": {&api.Pod{}}, + "pod-with-http-healthcheck": {&api.Pod{}}, + "pod-with-tcp-socket-healthcheck": {&api.Pod{}}, + "podtemplate": {&api.PodTemplate{}}, + "service": {&api.Service{}}, }, } From 52b915608ddd8dc1457f3266d8edd8c45c9e1885 Mon Sep 17 00:00:00 2001 From: Colby Scotta Date: Tue, 21 Nov 2017 11:23:51 -0500 Subject: [PATCH 08/45] IBM Bluemix was renamed to IBM Cloud recently --- _data/setup.yml | 6 +++--- docs/setup/pick-right-solution.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/_data/setup.yml b/_data/setup.yml index b1b0106881..d2907e9433 100644 --- a/_data/setup.yml +++ b/_data/setup.yml @@ -23,8 +23,8 @@ toc: path: https://cloud.google.com/kubernetes-engine/docs/before-you-begin/ - title: Running Kubernetes on Azure Container Service path: https://docs.microsoft.com/en-us/azure/container-service/container-service-kubernetes-walkthrough - - title: Running Kubernetes on IBM Bluemix Container Service - path: https://console.ng.bluemix.net/docs/containers/container_index.html + - title: Running Kubernetes on IBM Cloud Container Service + path: https://console.bluemix.net/docs/containers/container_index.html - title: Turn-key Cloud Solutions section: @@ -33,7 +33,7 @@ toc: - docs/getting-started-guides/azure.md - docs/getting-started-guides/alibaba-cloud.md - docs/getting-started-guides/clc.md - - title: Running Kubernetes on IBM Bluemix + - title: Running Kubernetes on IBM Cloud path: https://github.com/patrocinio/kubernetes-softlayer - docs/getting-started-guides/stackpoint.md diff --git a/docs/setup/pick-right-solution.md b/docs/setup/pick-right-solution.md index d823609725..2c9c7844c1 100644 --- a/docs/setup/pick-right-solution.md +++ b/docs/setup/pick-right-solution.md @@ -55,7 +55,7 @@ a Kubernetes cluster from scratch. * [OpenShift Online](https://www.openshift.com/features/) provides free hosted access for Kubernetes applications. -* [IBM Bluemix Container Service](https://console.ng.bluemix.net/docs/containers/container_index.html) offers managed Kubernetes clusters with isolation choice, operational tools, integrated security insight into images and containers, and integration with Watson, IoT, and data. +* [IBM Cloud Container Service](https://console.bluemix.net/docs/containers/container_index.html) offers managed Kubernetes clusters with isolation choice, operational tools, integrated security insight into images and containers, and integration with Watson, IoT, and data. * [Giant Swarm](https://giantswarm.io/product/) offers managed Kubernetes clusters in their own datacenter, on-premises, or on public clouds. @@ -70,7 +70,7 @@ few commands. These solutions are actively developed and have active community s * [Azure](/docs/getting-started-guides/azure/) * [Tectonic by CoreOS](https://coreos.com/tectonic) * [CenturyLink Cloud](/docs/getting-started-guides/clc/) -* [IBM Bluemix](https://github.com/patrocinio/kubernetes-softlayer) +* [IBM Cloud](https://github.com/patrocinio/kubernetes-softlayer) * [Stackpoint.io](/docs/getting-started-guides/stackpoint/) * [KUBE2GO.io](https://kube2go.io/) * [Madcore.Ai](https://madcore.ai/) From bb0d2771c47413d5fbcff153463c0c19dc469a76 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Tue, 21 Nov 2017 14:52:25 -0800 Subject: [PATCH 09/45] Service Catalog docs (#5867) * Service Catalog docs (+16 squashed commits) Squashed commits: [765e81d] rework install-service-catalog.md [d81f799] tweak diagrams [b7a3da7] Add tooltips [3b256c5] more rework [828000e] architecture diagram redux [0b809d5] rework [7829301] Outline provision-bind-external-service.md w/ filler text [144fbb3] install service catalog v1 [47b5be4] Reorder images and bullet points [fb577ae] Update What's Next links [8ac984c] Include snippet for install and provision docs [c2eeece] Add Install Service Catalog doc [a84df64] Add hard line break [7fb12c6] Add task [75c46d3] Add List, Provision, and Bind diagrams [6386feb] Service Catalog concept doc * Add install-service-catalog-using-helm * switch mysql examples to message queuing instead * Incorporate feedback * incorporate additional feedback * Incorporate tech review feedback --- _data/concepts.yml | 1 + _data/glossary/managed-service.yaml | 9 + _data/glossary/service-broker.yaml | 9 + _data/glossary/service-catalog.yaml | 8 + _data/tasks.yml | 4 +- docs/concepts/service-catalog/index.md | 234 ++++++++++++++++++ .../install-service-catalog-using-helm.md | 100 ++++++++ .../install-service-catalog-using-sc.md | 77 ++++++ images/docs/service-catalog-architecture.svg | 138 +++++++++++ images/docs/service-catalog-bind.svg | 115 +++++++++ images/docs/service-catalog-list.svg | 136 ++++++++++ images/docs/service-catalog-map.svg | 100 ++++++++ images/docs/service-catalog-provision.svg | 125 ++++++++++ 13 files changed, 1055 insertions(+), 1 deletion(-) create mode 100644 _data/glossary/managed-service.yaml create mode 100644 _data/glossary/service-broker.yaml create mode 100644 _data/glossary/service-catalog.yaml create mode 100644 docs/concepts/service-catalog/index.md create mode 100644 docs/tasks/service-catalog/install-service-catalog-using-helm.md create mode 100644 docs/tasks/service-catalog/install-service-catalog-using-sc.md create mode 100644 images/docs/service-catalog-architecture.svg create mode 100644 images/docs/service-catalog-bind.svg create mode 100644 images/docs/service-catalog-list.svg create mode 100644 images/docs/service-catalog-map.svg create mode 100644 images/docs/service-catalog-provision.svg diff --git a/_data/concepts.yml b/_data/concepts.yml index 8eaab9e39e..1051266be0 100644 --- a/_data/concepts.yml +++ b/_data/concepts.yml @@ -33,6 +33,7 @@ toc: - docs/concepts/cluster-administration/network-plugins.md - docs/concepts/cluster-administration/device-plugins.md - docs/concepts/cluster-administration/sysctl-cluster.md + - docs/concepts/service-catalog/index.md - title: Containers section: diff --git a/_data/glossary/managed-service.yaml b/_data/glossary/managed-service.yaml new file mode 100644 index 0000000000..409831141f --- /dev/null +++ b/_data/glossary/managed-service.yaml @@ -0,0 +1,9 @@ +id: managed-service +name: Managed Service +tags: +- extension +short-description: > + A software offering maintained by a third-party provider. +long-description: > + Some examples of Managed Services are AWS EC2, Azure SQL Database, and GCP Pub/Sub, but they can be any software offering that can be used by an application. + [Service Catalog](/docs/concepts/service-catalog/) provides a way to list, provision, and bind with Managed Services offered by {% glossary_tooltip text="Service Brokers" term_id="service-broker" %}. \ No newline at end of file diff --git a/_data/glossary/service-broker.yaml b/_data/glossary/service-broker.yaml new file mode 100644 index 0000000000..9cdc99bbcb --- /dev/null +++ b/_data/glossary/service-broker.yaml @@ -0,0 +1,9 @@ +id: service-broker +name: Service Broker +tags: +- extension +short-description: > + An endpoint for a set of {% glossary_tooltip text="Managed Services" term_id="managed-service" %} offered and maintained by a third-party. +long-description: > + {% glossary_tooltip text="Service Brokers" term_id="service-broker" %} implement the [Open Service Broker API spec](https://github.com/openservicebrokerapi/servicebroker/blob/v2.13/spec.md) and provide a standard interface for applications to use their Managed Services. + [Service Catalog](/docs/concepts/service-catalog/) provides a way to list, provision, and bind with Managed Services offered by Service Brokers. \ No newline at end of file diff --git a/_data/glossary/service-catalog.yaml b/_data/glossary/service-catalog.yaml new file mode 100644 index 0000000000..bcbadd309c --- /dev/null +++ b/_data/glossary/service-catalog.yaml @@ -0,0 +1,8 @@ +id: service-catalog +name: Service Catalog +tags: +- extension +short-description: > + An extension API that enables applications running in Kubernetes clusters to easily use external managed software offerings, such as a datastore service offered by a cloud provider. +long-description: > + Service Catalog provides a way to list, provision, and bind with external {% glossary_tooltip text="Managed Services" term_id="managed-service" %} from {% glossary_tooltip text="Service Brokers" term_id="service-broker" %} without needing detailed knowledge about how those services are created or managed. \ No newline at end of file diff --git a/_data/tasks.yml b/_data/tasks.yml index 4820d91855..15eb64620b 100644 --- a/_data/tasks.yml +++ b/_data/tasks.yml @@ -100,7 +100,7 @@ toc: - title: Use Explorer to Examine the Runtime Environment path: https://github.com/kubernetes/kubernetes/tree/release-1.5/examples/explorer -- title: Access and Extend the Kubernetes API +- title: Extend Kubernetes section: - docs/tasks/access-kubernetes-api/http-proxy-access-api.md - docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions.md @@ -108,6 +108,8 @@ toc: - docs/tasks/access-kubernetes-api/migrate-third-party-resource.md - docs/tasks/access-kubernetes-api/configure-aggregation-layer.md - docs/tasks/access-kubernetes-api/setup-extension-api-server.md + - docs/tasks/service-catalog/install-service-catalog-using-helm.md + - docs/tasks/service-catalog/install-service-catalog-using-sc.md - title: TLS section: diff --git a/docs/concepts/service-catalog/index.md b/docs/concepts/service-catalog/index.md new file mode 100644 index 0000000000..bf98efe9c5 --- /dev/null +++ b/docs/concepts/service-catalog/index.md @@ -0,0 +1,234 @@ +--- +title: Service Catalog +approvers: +- chenopis +--- + +{% capture overview %} +{% glossary_definition term_id="service-catalog" length="all" prepend="Service Catalog is " %} + +A *Service Broker*, as defined by the [Open Service Broker API spec](https://github.com/openClusterServiceBrokerapi/ClusterServiceBroker/blob/v2.13/spec.md), is an endpoint for a set of Managed Services offered and maintained by a third-party, which could be a cloud provider such as AWS, GCP, or Azure. +Some examples of *Managed Services* are Microsoft Azure Cloud Queue, Amazon Simple Queue Service, and Google Cloud Pub/Sub, but they can be any software offering that can be used by an application. + +Using Service Catalog, a {% glossary_tooltip text="Cluster Operator" term_id="cluster-operator" %} can browse the list of {% glossary_tooltip text="Managed Services" term_id="managed-service" %} offered by a {% glossary_tooltip text="Service Brokers" term_id="service-broker" %}, provision an instance of a Managed Service, and bind with it to make it available to an application within the Kubernetes cluster. + +{% endcapture %} + + +{% capture body %} +## Example use case + +An {% glossary_tooltip text="Application Developer" term_id="application-developer" %} wants to use message queuing as part of their application running in a Kubernetes cluster. +However, they do not want to deal with the overhead of setting such a service up and administering it themselves. +Fortunately, there is a cloud provider that offers message queuing as a *Managed Service* through their *Service Broker*. + +A {% glossary_tooltip text="Cluster Operator" term_id="cluster-operator" %} can setup Service Catalog and use it to communicate with the cloud provider's {% glossary_tooltip text="Service Broker" term_id="service-broker" %} to provision an instance of the message queuing service and make it available to the application within the Kubernetes cluster. +The {% glossary_tooltip text="Application Developer" term_id="application-developer" %} therefore does not need to concern themselves with the implementation details or management of the message queue. +Their application can simply use it as a service. + +## Architecture + +Service Catalog uses the [Open Service Broker API](https://github.com/openClusterServiceBrokerapi/ClusterServiceBroker) to communicate with Service Brokers, acting as an intermediary for the Kubernetes API Server in order to negotiate the initial provisioning and retrieve the credentials necessary for the application to use a Managed Service. + +It is implemented as an extension API server and a controller manager, using Etcd for storage. It also uses the [aggregation layer](/docs/concepts/api-extension/apiserver-aggregation/) available in Kubernetes 1.7+ to present its API. + +
+ +![Service Catalog Architecture](/images/docs/service-catalog-architecture.svg) + + +### API Resources + +Service Catalog installs the `servicecatalog.k8s.io` API and provides the following Kubernetes resources: + +* `ClusterServiceBroker`: An in-cluster representation of a Service Broker, encapsulating its server connection details. +These are created and managed by Cluster Operators who wish to use that broker server to make new types of Managed Services available within their cluster. +* `ClusterServiceClass`: A Managed Service offered by a particular Service Broker. +When a new `ClusterServiceBroker` resource is added to the cluster, the Service Catalog controller connects to the Service Broker to obtain a list of available Managed Services. It then creates a new `ClusterServiceClass` resource corresponding to each Managed Service. +* `ClusterServicePlan`: A specific offering of a Managed Service. For example, a Managed Service may have different plans available, such as a free tier or paid tier, or it may have different configuration options, such as using SSD storage or having more resources. Similar to `ClusterServiceClass`, when a new `ClusterServiceBroker` is added to the cluster, the Service Catalog creates a new `ClusterServicePlan` resource corresponding to each Service Plan available for each Managed Service. +* `ServiceInstance`: A provisioned instance of a `ClusterServiceClass`. +These are created by Cluster Operators to make a specific instance of a Managed Service available for use by one or more in-cluster applications. +When a new `ServiceInstance` resource is created, the Service Catalog controller will connect to the appropriate Service Broker and instruct it to provision the service instance. +* `ServiceBinding`: Access credentials to a `ServiceInstance`. +These are created by Cluster Operators who want their applications to make use of a Service `ServiceInstance`. +Upon creation, the Service Catalog controller will create a Kubernetes `Secret` containing connection details and credentials for the Service Instance, which can be mounted into Pods. + +### Authentication + +Service Catalog supports these methods of authentication: + +* Basic (username/password) +* [OAuth 2.0 Bearer Token](https://tools.ietf.org/html/rfc6750) + +## Usage + +A {% glossary_tooltip text="Cluster Operator" term_id="cluster-operator" %} can use the Service Catalog API Resources to provision Managed Services and make them available within a Kubernetes cluster. The steps involved are: + +1. Listing the Managed Services and Service Plans available from a Service Broker. +1. Provisioning a new instance of the Managed Service. +1. Binding to the Managed Service, which returns the connection credentials. +1. Mapping the connection credentials into the application. + +### Listing Managed Services and Service Plans + +First, a {% glossary_tooltip text="Cluster Operator" term_id="cluster-operator" %} must create a `ClusterServiceBroker` resource within the `servicecatalog.k8s.io` group. This resource contains the URL and connection details necessary to access a Service Broker endpoint. + +This is an example of a `ClusterServiceBroker` resource: + +```yaml +apiVersion: servicecatalog.k8s.io/v1beta1 +kind: ClusterServiceBroker +metadata: + name: cloud-broker +spec: + # Points to the endpoint of a Service Broker. (This example is not a working URL.) + url: https://servicebroker.somecloudprovider.com/v1alpha1/projects/service-catalog/brokers/default + ##### + # Additional values can be added here, which may be used to communicate + # with the Service Broker, such as bearer token info or a caBundle for TLS. + ##### +``` + +The following is a sequence diagram illustrating the steps involved in listing Managed Services and Plans available from a Service Broker: + +![List Services](/images/docs/service-catalog-list.svg){:height="80%" width="80%"} + +1. Once the `ClusterServiceBroker` resource is added to Service Catalog, it triggers a *List Services* call to the external Service Broker. +1. The Service Broker returns a list of available Managed Services and Service Plans, which are cached locally in `ClusterServiceClass` and `ClusterServicePlan` resources. +1. A {% glossary_tooltip text="Cluster Operator" term_id="cluster-operator" %} can then get the list of available Managed Services using the following command: + + kubectl get clusterserviceclasses -o=custom-columns=SERVICE\ NAME:.metadata.name,EXTERNAL\ NAME:.spec.externalName + + It should output a list of service names with a format similar to: + + SERVICE NAME EXTERNAL NAME + 4f6e6cf6-ffdd-425f-a2c7-3c9258ad2468 cloud-provider-service + ... ... + + They can also view the Service Plans available using the following command: + + kubectl get clusterserviceplans -o=custom-columns=PLAN\ NAME:.metadata.name,EXTERNAL\ NAME:.spec.externalName + + It should output a list of plan names with a format similar to: + + PLAN NAME EXTERNAL NAME + 86064792-7ea2-467b-af93-ac9694d96d52 service-plan-name + ... ... + + +### Provisioning a new instance + +A {% glossary_tooltip text="Cluster Operator" term_id="cluster-operator" %} can initiate the provisioning of a new instance by creating a `ServiceInstance` resource. + +This is an example of a `ServiceInstance` resource: + +```yaml +apiVersion: servicecatalog.k8s.io/v1beta1 +kind: ServiceInstance +metadata: + name: cloud-queue-instance + namespace: cloud-apps +spec: + # References one of the previously returned services + clusterServiceClassExternalName: cloud-provider-service + clusterServicePlanExternalName: service-plan-name + ##### + # Additional parameters can be added here, + # which may be used by the Service Broker. + ##### +``` + +The following sequence diagram illustrates the steps involved in provisioning a new instance of a Managed Service: + +![Provision a Service](/images/docs/service-catalog-provision.svg){:height="80%" width="80%"} + +1. When the `ServiceInstance` resource is created, Service Catalog initiates a *Provision Instance* call to the external Service Broker. +1. The Service Broker creates a new instance of the Managed Service and returns an HTTP response. +1. A {% glossary_tooltip text="Cluster Operator" term_id="cluster-operator" %} can then check the status of the instance to see if it is ready. + +### Binding to a Managed Service + +After a new instance has been provisioned, a {% glossary_tooltip text="Cluster Operator" term_id="cluster-operator" %} must bind to the Managed Service to get the connection credentials and service account details necessary for the application to use the service. This is done by creating a `ServiceBinding` resource. + +The following is an example of a `ServiceBinding` resource: + +```yaml +apiVersion: servicecatalog.k8s.io/v1beta1 +kind: ServiceBinding +metadata: + name: cloud-queue-binding + namespace: cloud-apps +spec: + instanceRef: + name: cloud-queue-instance + ##### + # Additional information can be added here, such as a secretName or + # service account parameters, which may be used by the Service Broker. + ##### +``` + +The following sequence diagram illustrates the steps involved in binding to a Managed Service instance: + +![Bind to a Managed Service](/images/docs/service-catalog-bind.svg){:height="80%" width="80%"} + +1. After the `ServiceBinding` is created, Service Catalog makes a *Bind Instance* call to the external Service Broker. +1. The Service Broker enables the application permissions/roles for the appropriate service account. +1. The Service Broker returns the information necessary to connect and access the Managed Service instance. This is provider and service-specific so the information returned may differ between Service Providers and their Managed Services. + +### Mapping the connection credentials + +After binding, the final step involves mapping the connection credentials and service-specific information into the application. +These pieces of information are stored in secrets that the application in the cluster can access and use to connect directly with the Managed Service. + +
+ +![Map connection credentials](/images/docs/service-catalog-map.svg) + +#### Pod Configuration File + +One method to perform this mapping is to use a declarative Pod configuration. + +The following example describes how to map service account credentials into the application. A key called `sa-key` is stored in a volume named `provider-cloud-key`, and the application mounts this volume at `/var/secrets/provider/key.json`. The environment variable `GOOGLE_APPLICATION_CREDENTIALS` is mapped from the value of the mounted file. + +```yaml +... + spec: + volumes: + - name: provider-cloud-key + secret: + secretName: sa-key + containers: +... + volumeMounts: + - name: provider-cloud-key + mountPath: /var/secrets/provider + env: + - name: PROVIDER_APPLICATION_CREDENTIALS + value: "/var/secrets/provider/key.json" +``` + +The following example describes how to map secret values into application environment variables. In this example, the messaging queue topic name is mapped from a secret named `provider-queue-credentials` with a key named `topic` to the environment variable `TOPIC`. + + +```yaml +... + env: + - name: "TOPIC" + valueFrom: + secretKeyRef: + name: provider-queue-credentials + key: topic +``` + +{% endcapture %} + + +{% capture whatsnext %} +* If you are familiar with {% glossary_tooltip text="Helm Charts" term_id="helm-chart" %}, [install Service Catalog using Helm](/docs/tasks/service-catalog/install-service-catalog-using-helm/) into your Kubernetes cluster. Alternatively, you can [install Service Catalog using the SC tool](/docs/tasks/service-catalog/install-service-catalog-using-sc/). +* View [sample service brokers](https://github.com/openClusterServiceBrokerapi/ClusterServiceBroker/blob/master/gettingStarted.md#sample-service-brokers). +* Explore the [kubernetes-incubator/service-catalog](https://github.com/kubernetes-incubator/service-catalog) project. + +{% endcapture %} + + +{% include templates/concept.md %} diff --git a/docs/tasks/service-catalog/install-service-catalog-using-helm.md b/docs/tasks/service-catalog/install-service-catalog-using-helm.md new file mode 100644 index 0000000000..9ce776cb28 --- /dev/null +++ b/docs/tasks/service-catalog/install-service-catalog-using-helm.md @@ -0,0 +1,100 @@ +--- +title: Install Service Catalog using Helm +approvers: +- chenopis +--- + +{% capture overview %} +{% glossary_definition term_id="service-catalog" length="long" %} + +Use [Helm](https://helm.sh/) to install Service Catalog on your Kubernetes cluster. Up to date information on this process can be found at the [kubernetes-incubator/service-catalog](https://github.com/kubernetes-incubator/service-catalog/blob/master/docs/install.md) repo. + +{% endcapture %} + + +{% capture prerequisites %} +* Understand the key concepts of [Service Catalog](/docs/concepts/service-catalog/). +* Service Catalog requires a Kubernetes cluster running version 1.7 or higher. +* You must have a Kubernetes cluster with cluster DNS enabled. + * If you are using a cloud-based Kubernetes cluster or {% glossary_tooltip text="Minikube" term_id="minikube" %}, you may already have cluster DNS enabled. + * If you are using `hack/local-up-cluster.sh`, ensure that the `KUBE_ENABLE_CLUSTER_DNS` environment variable is set, then run the install script. +* [Install and setup kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) v1.7 or higher. Make sure it is configured to connect to the Kubernetes cluster. +* Install [Helm](http://helm.sh/) v2.7.0 or newer. + * Follow the [Helm install instructions](https://github.com/kubernetes/helm/blob/master/docs/install.md). + * If you already have an appropriate version of Helm installed, execute `helm init` to install Tiller, the server-side component of Helm. + +{% endcapture %} + + +{% capture steps %} +## Add the service-catalog Helm repository + +Once Helm is installed, add the *service-catalog* Helm repository to your local machine by executing the following command: + +```shell +helm repo add svc-cat https://svc-catalog-charts.storage.googleapis.com +``` + +Check to make sure that it installed successfully by executing the following command: + +```shell +helm search service-catalog +``` + +If the installation was successful, the command should output the following: + +``` +NAME VERSION DESCRIPTION +svc-cat/catalog 0.0.1 service-catalog API server and controller-manag... +``` + +## Enable RBAC + +Your Kubernetes cluster must have RBAC enabled, which requires your Tiller Pod(s) to have `cluster-admin` access. + +If you are using {% glossary_tooltip text="Minikube" term_id="minikube" %}, run the `minikube start` command with the following flag: + +```shell +minikube start --extra-config=apiserver.Authorization.Mode=RBAC +``` + +If you are using `hack/local-up-cluster.sh`, set the `AUTHORIZATION_MODE` environment variable with the following values: + +``` +AUTHORIZATION_MODE=Node,RBAC hack/local-up-cluster.sh -O +``` + +By default, `helm init` installs the Tiller Pod into the `kube-system` namespace, with Tiller configured to use the `default` service account. + +**NOTE:** If you used the `--tiller-namespace` or `--service-account` flags when running `helm init`, the `--serviceaccount` flag in the following command needs to be adjusted to reference the appropriate namespace and ServiceAccount name. +{: .note} + +Configure Tiller to have `cluster-admin` access: + +```shell +kubectl create clusterrolebinding tiller-cluster-admin \ + --clusterrole=cluster-admin \ + --serviceaccount=kube-system:default +``` + + +## Install Service Catalog in your Kubernetes cluster + +Install Service Catalog from the root of the Helm repository using the following command: + +```shell +helm install svc-cat/catalog \ + --name catalog --namespace catalog +``` + +{% endcapture %} + + +{% capture whatsnext %} +* View [sample service brokers](https://github.com/openservicebrokerapi/servicebroker/blob/master/gettingStarted.md#sample-service-brokers). +* Explore the [kubernetes-incubator/service-catalog](https://github.com/kubernetes-incubator/service-catalog) project. + +{% endcapture %} + + +{% include templates/task.md %} \ No newline at end of file diff --git a/docs/tasks/service-catalog/install-service-catalog-using-sc.md b/docs/tasks/service-catalog/install-service-catalog-using-sc.md new file mode 100644 index 0000000000..e235e0e0ed --- /dev/null +++ b/docs/tasks/service-catalog/install-service-catalog-using-sc.md @@ -0,0 +1,77 @@ +--- +title: Install Service Catalog using SC +approvers: +- chenopis +--- + +{% capture overview %} +{% glossary_definition term_id="service-catalog" length="long" %} + +Use the [Service Catalog Installer](https://github.com/GoogleCloudPlatform/k8s-service-catalog#installation) tool to easily install or uninstall Service Catalog on your Kubernetes cluster. This CLI tool is installed as `sc` in your local environment. + +{% endcapture %} + + +{% capture prerequisites %} +* Understand the key concepts of [Service Catalog](/docs/concepts/service-catalog/). +* Install [Go 1.6+](https://golang.org/dl/) and set the `GOPATH`. +* Install the [cfssl](https://github.com/cloudflare/cfssl) tool needed for generating SSL artifacts. +* Service Catalog requires Kubernetes version 1.7+. +* [Install and setup kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) so that it is configured to connect to a Kubernetes v1.7+ cluster. +* The kubectl user must be bound to the *cluster-admin* role for it to install Service Catalog. To ensure that this is true, run the following command: + + kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user= + +{% endcapture %} + + +{% capture steps %} +## Install `sc` in your local environment + +Install the `sc` CLI tool using the `go get` command: + +```Go +go get github.com/GoogleCloudPlatform/k8s-service-catalog/installer/cmd/sc +``` + +After running the above command, `sc` should be installed in your `GOPATH/bin` directory. + +## Install Service Catalog in your Kubernetes cluster + +First, verify that all dependencies have been installed. Run: + +```shell +sc check +``` + +If the check is successful, it should return: + +``` +Dependency check passed. You are good to go. +``` + +Next, run the install command and specify the `storageclass` that you want to use for the backup: + +```shell +sc install --etcd-backup-storageclass "standard" +``` + +## Uninstall Service Catalog + +If you would like to uninstall Service Catalog from your Kubernetes cluster using the `sc` tool, run: + +```shell +sc uninstall +``` + +{% endcapture %} + + +{% capture whatsnext %} +* View [sample service brokers](https://github.com/openservicebrokerapi/servicebroker/blob/master/gettingStarted.md#sample-service-brokers). +* Explore the [kubernetes-incubator/service-catalog](https://github.com/kubernetes-incubator/service-catalog) project. + +{% endcapture %} + + +{% include templates/task.md %} \ No newline at end of file diff --git a/images/docs/service-catalog-architecture.svg b/images/docs/service-catalog-architecture.svg new file mode 100644 index 0000000000..57c7558d5a --- /dev/null +++ b/images/docs/service-catalog-architecture.svg @@ -0,0 +1,138 @@ + + + + Produced by OmniGraffle 7.5 + 2017-11-17 22:47:47 +0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + architecture + + Layer 1 + + + + Service Broker + A + + + + API Server + + + + Service Catalog + servicecatalog.k8s.io: + ClusterServiceBroker + ClusterServiceClass + ClusterServicePlan + ServiceInstance + ServiceBinding + + + + Application + + + + + + + + Service Broker Z + + + + Managed Service 2 + + + + Managed Service N + + + + Managed Service 1 + + + + Open Service Broker + API + + + List Services + Provision Instance + Bind Instance + + + + + + + + + + Bind Instance + + + + Secret: + Connection Credentials + Service Details + + + Kubernetes + + + + diff --git a/images/docs/service-catalog-bind.svg b/images/docs/service-catalog-bind.svg new file mode 100644 index 0000000000..0a57f944aa --- /dev/null +++ b/images/docs/service-catalog-bind.svg @@ -0,0 +1,115 @@ + + + + Produced by OmniGraffle 7.5 + 2017-11-17 22:45:14 +0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + V2b + + Layer 1 + + + + + + + + + + + + Bind Instance + + + + + Connection + Information + + + + ServiceBinding + Resource + + + + ServiceBinding + Resource + + + + + Service Catalog + API Server + + + + Service Broker + + + + Cluster Operator + + + + + + 1. + + + + + + + 3. + + + + + + Service + + + + + + 2. + + + + + diff --git a/images/docs/service-catalog-list.svg b/images/docs/service-catalog-list.svg new file mode 100644 index 0000000000..ba1802d8fe --- /dev/null +++ b/images/docs/service-catalog-list.svg @@ -0,0 +1,136 @@ + + + + Produced by OmniGraffle 7.5 + 2017-11-17 22:45:14 +0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + V2b + + Layer 1 + + + + + + + + + + ClusterServiceClass + Resource + + + + + + + Service Catalog + API Server + + + + Service Broker + + + + List Services + + + + ClusterServiceBroker + Resource + + + + + + Cluster Operator + + + + + + 2. + + + + + + + 3. + + + + + + + 1. + + + + + + List of + Services, + Plans + + + + + ClusterServicePlan + Resource + + + + Services, Plans + + + + get clusterserviceplans + + + + get clusterserviceclasses + + + + diff --git a/images/docs/service-catalog-map.svg b/images/docs/service-catalog-map.svg new file mode 100644 index 0000000000..091cd4efef --- /dev/null +++ b/images/docs/service-catalog-map.svg @@ -0,0 +1,100 @@ + + + + Produced by OmniGraffle 7.5 + 2017-11-07 08:04:59 +0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + map creds + + Layer 1 + + + + Service Broker + + + + API Server + + + + Service Catalog + servicecatalog.k8s.io: + ServiceBinding + + + + Application + + + + Managed Service + Instance + + + + Bind Instance + + + Service Account + + + + + + + Secret: + Connection Credentials + Service + Account Details + + + + Kubernetes + + + + diff --git a/images/docs/service-catalog-provision.svg b/images/docs/service-catalog-provision.svg new file mode 100644 index 0000000000..748ba3a336 --- /dev/null +++ b/images/docs/service-catalog-provision.svg @@ -0,0 +1,125 @@ + + + + Produced by OmniGraffle 7.5 + 2017-11-17 23:02:50 +0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + V2b + + Layer 1 + + + + + + + + + + + + Provision Instance + + + + + ServiceInstance + Resource + + + + ServiceInstance + Resource + + + + + + get serviceinstance + + + + + READY + + + + Service Catalog + API Server + + + + Service Broker + + + + Cluster Operator + + + + + + 3. + + + + + + + 1. + + + + + + + 2. + + + + + + Service + + + + From da5fac35badd4af2f2070ddd790206c946fc4ba2 Mon Sep 17 00:00:00 2001 From: Kevin Hoffman Date: Wed, 22 Nov 2017 08:23:12 -0500 Subject: [PATCH 10/45] Update index.md Stale links to service broker specs and documentation. --- docs/concepts/service-catalog/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/concepts/service-catalog/index.md b/docs/concepts/service-catalog/index.md index bf98efe9c5..814505ccb3 100644 --- a/docs/concepts/service-catalog/index.md +++ b/docs/concepts/service-catalog/index.md @@ -7,7 +7,7 @@ approvers: {% capture overview %} {% glossary_definition term_id="service-catalog" length="all" prepend="Service Catalog is " %} -A *Service Broker*, as defined by the [Open Service Broker API spec](https://github.com/openClusterServiceBrokerapi/ClusterServiceBroker/blob/v2.13/spec.md), is an endpoint for a set of Managed Services offered and maintained by a third-party, which could be a cloud provider such as AWS, GCP, or Azure. +A *Service Broker*, as defined by the [Open Service Broker API spec](https://github.com/openservicebrokerapi/servicebroker/blob/v2.13/spec.md), is an endpoint for a set of Managed Services offered and maintained by a third-party, which could be a cloud provider such as AWS, GCP, or Azure. Some examples of *Managed Services* are Microsoft Azure Cloud Queue, Amazon Simple Queue Service, and Google Cloud Pub/Sub, but they can be any software offering that can be used by an application. Using Service Catalog, a {% glossary_tooltip text="Cluster Operator" term_id="cluster-operator" %} can browse the list of {% glossary_tooltip text="Managed Services" term_id="managed-service" %} offered by a {% glossary_tooltip text="Service Brokers" term_id="service-broker" %}, provision an instance of a Managed Service, and bind with it to make it available to an application within the Kubernetes cluster. @@ -28,7 +28,7 @@ Their application can simply use it as a service. ## Architecture -Service Catalog uses the [Open Service Broker API](https://github.com/openClusterServiceBrokerapi/ClusterServiceBroker) to communicate with Service Brokers, acting as an intermediary for the Kubernetes API Server in order to negotiate the initial provisioning and retrieve the credentials necessary for the application to use a Managed Service. +Service Catalog uses the [Open Service Broker API](https://github.com/openservicebrokerapi/servicebroker) to communicate with Service Brokers, acting as an intermediary for the Kubernetes API Server in order to negotiate the initial provisioning and retrieve the credentials necessary for the application to use a Managed Service. It is implemented as an extension API server and a controller manager, using Etcd for storage. It also uses the [aggregation layer](/docs/concepts/api-extension/apiserver-aggregation/) available in Kubernetes 1.7+ to present its API. @@ -225,7 +225,7 @@ The following example describes how to map secret values into application enviro {% capture whatsnext %} * If you are familiar with {% glossary_tooltip text="Helm Charts" term_id="helm-chart" %}, [install Service Catalog using Helm](/docs/tasks/service-catalog/install-service-catalog-using-helm/) into your Kubernetes cluster. Alternatively, you can [install Service Catalog using the SC tool](/docs/tasks/service-catalog/install-service-catalog-using-sc/). -* View [sample service brokers](https://github.com/openClusterServiceBrokerapi/ClusterServiceBroker/blob/master/gettingStarted.md#sample-service-brokers). +* View [sample service brokers](https://github.com/openservicebrokerapi/servicebroker/blob/master/gettingStarted.md#sample-service-brokers). * Explore the [kubernetes-incubator/service-catalog](https://github.com/kubernetes-incubator/service-catalog) project. {% endcapture %} From c5319e204b3192bafe4bfdd9e12bcd964d2c90a8 Mon Sep 17 00:00:00 2001 From: Qiming Date: Thu, 23 Nov 2017 03:47:05 +0800 Subject: [PATCH 11/45] Sort volumes for easier browsing (#6320) --- docs/concepts/storage/volumes.md | 891 ++++++++++++++++--------------- 1 file changed, 455 insertions(+), 436 deletions(-) diff --git a/docs/concepts/storage/volumes.md b/docs/concepts/storage/volumes.md index 4ea6df948a..2d2ad25678 100644 --- a/docs/concepts/storage/volumes.md +++ b/docs/concepts/storage/volumes.md @@ -65,33 +65,118 @@ mount each volume. Kubernetes supports several types of Volumes: - * `emptyDir` - * `hostPath` - * `gcePersistentDisk` * `awsElasticBlockStore` - * `nfs` - * `iscsi` - * `fc (fibre channel)` - * `flocker` - * `glusterfs` - * `rbd` - * `cephfs` - * `gitRepo` - * `secret` - * `persistentVolumeClaim` - * `downwardAPI` - * `projected` - * `azureFileVolume` * `azureDisk` - * `vsphereVolume` - * `Quobyte` - * `PortworxVolume` - * `ScaleIO` - * `StorageOS` + * `azureFile` + * `cephfs` + * `downwardAPI` + * `emptyDir` + * `fc` (fibre channel) + * `flocker` + * `gcePersistentDisk` + * `gitRepo` + * `glusterfs` + * `hostPath` + * `iscsi` * `local` + * `nfs` + * `persistentVolumeClaim` + * `projected` + * `portworxVolume` + * `quobyte` + * `rbd` + * `scaleIO` + * `secret` + * `storageos` + * `vsphereVolume` We welcome additional contributions. +### awsElasticBlockStore + +An `awsElasticBlockStore` volume mounts an Amazon Web Services (AWS) [EBS +Volume](http://aws.amazon.com/ebs/) into your pod. Unlike +`emptyDir`, which is erased when a Pod is removed, the contents of an EBS +volume are preserved and the volume is merely unmounted. This means that an +EBS volume can be pre-populated with data, and that data can be "handed off" +between pods. + +**Important:** You must create an EBS volume using `aws ec2 create-volume` or the AWS API before you can use it. +{: .caution} + +There are some restrictions when using an awsElasticBlockStore volume: + +* the nodes on which pods are running must be AWS EC2 instances +* those instances need to be in the same region and availability-zone as the EBS volume +* EBS only supports a single EC2 instance mounting a volume + +#### Creating an EBS volume + +Before you can use an EBS volume with a pod, you need to create it. + +```shell +aws ec2 create-volume --availability-zone=eu-west-1a --size=10 --volume-type=gp2 +``` + +Make sure the zone matches the zone you brought up your cluster in. (And also check that the size and EBS volume +type are suitable for your use!) + +#### AWS EBS Example configuration + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: test-ebs +spec: + containers: + - image: gcr.io/google_containers/test-webserver + name: test-container + volumeMounts: + - mountPath: /test-ebs + name: test-volume + volumes: + - name: test-volume + # This AWS EBS volume must already exist. + awsElasticBlockStore: + volumeID: + fsType: ext4 +``` + +### azureDisk + +A `azureDisk` is used to mount a Microsoft Azure [Data Disk](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-linux-about-disks-vhds/) into a Pod. + +More details can be found [here](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/azure_disk/README.md). + +### azureFile + +A `azureFile` is used to mount a Microsoft Azure File Volume (SMB 2.1 and 3.0) +into a Pod. + +More details can be found [here](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/azure_file/README.md). + +### cephfs + +A `cephfs` volume allows an existing CephFS volume to be +mounted into your pod. Unlike `emptyDir`, which is erased when a Pod is +removed, the contents of a `cephfs` volume are preserved and the volume is merely +unmounted. This means that a CephFS volume can be pre-populated with data, and +that data can be "handed off" between pods. CephFS can be mounted by multiple +writers simultaneously. + +**Important:** You must have your own Ceph server running with the share exported before you can use it. +{: .caution} + +See the [CephFS example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/cephfs/) for more details. + +### downwardAPI + +A `downwardAPI` volume is used to make downward API data available to applications. +It mounts a directory and writes the requested data in plain text files. + +See the [`downwardAPI` volume example](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/) for more details. + ### emptyDir An `emptyDir` volume is first created when a Pod is assigned to a Node, and @@ -138,6 +223,132 @@ spec: emptyDir: {} ``` +### fc (fibre channel) + +An `fc` volume allows an existing fibre channel volume to be mounted in a pod. +You can specify single or multiple target World Wide Names using the parameter +`targetWWNs` in your volume configuration. If multiple WWNs are specified, +targetWWNs expect that those WWNs are from multi-path connections. + +**Important:** You must configure FC SAN Zoning to allocate and mask those LUNs (volumes) to the target WWNs beforehand so that Kubernetes hosts can access them. +{: .caution} + +See the [FC example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/fibre_channel) for more details. + +### flocker + +[Flocker](https://clusterhq.com/flocker) is an open-source clustered container data volume manager. It provides management +and orchestration of data volumes backed by a variety of storage backends. + +A `flocker` volume allows a Flocker dataset to be mounted into a pod. If the +dataset does not already exist in Flocker, it needs to be first created with the Flocker +CLI or by using the Flocker API. If the dataset already exists it will be +reattached by Flocker to the node that the pod is scheduled. This means data +can be "handed off" between pods as required. + +**Important:** You must have your own Flocker installation running before you can use it. +{: .caution} + +See the [Flocker example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/flocker) for more details. + +### gcePersistentDisk + +A `gcePersistentDisk` volume mounts a Google Compute Engine (GCE) [Persistent +Disk](http://cloud.google.com/compute/docs/disks) into your pod. Unlike +`emptyDir`, which is erased when a Pod is removed, the contents of a PD are +preserved and the volume is merely unmounted. This means that a PD can be +pre-populated with data, and that data can be "handed off" between pods. + +**Important:** You must create a PD using `gcloud` or the GCE API or UI before you can use it. +{: .caution} + +There are some restrictions when using a `gcePersistentDisk`: + +* the nodes on which pods are running must be GCE VMs +* those VMs need to be in the same GCE project and zone as the PD + +A feature of PD is that they can be mounted as read-only by multiple consumers +simultaneously. This means that you can pre-populate a PD with your dataset +and then serve it in parallel from as many pods as you need. Unfortunately, +PDs can only be mounted by a single consumer in read-write mode - no +simultaneous writers allowed. + +Using a PD on a pod controlled by a ReplicationController will fail unless +the PD is read-only or the replica count is 0 or 1. + +#### Creating a PD + +Before you can use a GCE PD with a pod, you need to create it. + +```shell +gcloud compute disks create --size=500GB --zone=us-central1-a my-data-disk +``` + +#### Example pod + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: test-pd +spec: + containers: + - image: gcr.io/google_containers/test-webserver + name: test-container + volumeMounts: + - mountPath: /test-pd + name: test-volume + volumes: + - name: test-volume + # This GCE PD must already exist. + gcePersistentDisk: + pdName: my-data-disk + fsType: ext4 +``` + +### gitRepo + +A `gitRepo` volume is an example of what can be done as a volume plugin. It +mounts an empty directory and clones a git repository into it for your pod to +use. In the future, such volumes may be moved to an even more decoupled model, +rather than extending the Kubernetes API for every such use case. + +Here is an example for gitRepo volume: + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: server +spec: + containers: + - image: nginx + name: nginx + volumeMounts: + - mountPath: /mypath + name: git-volume + volumes: + - name: git-volume + gitRepo: + repository: "git@somewhere:me/my-git-repository.git" + revision: "22f1d8406d464b0c0874075539c1f2e96c253775" +``` + +### glusterfs + +A `glusterfs` volume allows a [Glusterfs](http://www.gluster.org) (an open +source networked filesystem) volume to be mounted into your pod. Unlike +`emptyDir`, which is erased when a Pod is removed, the contents of a +`glusterfs` volume are preserved and the volume is merely unmounted. This +means that a glusterfs volume can be pre-populated with data, and that data can +be "handed off" between pods. GlusterFS can be mounted by multiple writers +simultaneously. + +**Important:** You must have your own GlusterFS installation running before you can use it. +{: .caution} + +See the [GlusterFS example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/glusterfs) for more details. + ### hostPath A `hostPath` volume mounts a file or directory from the host node's filesystem @@ -202,126 +413,6 @@ spec: type: Directory ``` -### gcePersistentDisk - -A `gcePersistentDisk` volume mounts a Google Compute Engine (GCE) [Persistent -Disk](http://cloud.google.com/compute/docs/disks) into your pod. Unlike -`emptyDir`, which is erased when a Pod is removed, the contents of a PD are -preserved and the volume is merely unmounted. This means that a PD can be -pre-populated with data, and that data can be "handed off" between pods. - -**Important:** You must create a PD using `gcloud` or the GCE API or UI before you can use it. -{: .caution} - -There are some restrictions when using a `gcePersistentDisk`: - -* the nodes on which pods are running must be GCE VMs -* those VMs need to be in the same GCE project and zone as the PD - -A feature of PD is that they can be mounted as read-only by multiple consumers -simultaneously. This means that you can pre-populate a PD with your dataset -and then serve it in parallel from as many pods as you need. Unfortunately, -PDs can only be mounted by a single consumer in read-write mode - no -simultaneous writers allowed. - -Using a PD on a pod controlled by a ReplicationController will fail unless -the PD is read-only or the replica count is 0 or 1. - -#### Creating a PD - -Before you can use a GCE PD with a pod, you need to create it. - -```shell -gcloud compute disks create --size=500GB --zone=us-central1-a my-data-disk -``` - -#### Example pod - -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: test-pd -spec: - containers: - - image: gcr.io/google_containers/test-webserver - name: test-container - volumeMounts: - - mountPath: /test-pd - name: test-volume - volumes: - - name: test-volume - # This GCE PD must already exist. - gcePersistentDisk: - pdName: my-data-disk - fsType: ext4 -``` - -### awsElasticBlockStore - -An `awsElasticBlockStore` volume mounts an Amazon Web Services (AWS) [EBS -Volume](http://aws.amazon.com/ebs/) into your pod. Unlike -`emptyDir`, which is erased when a Pod is removed, the contents of an EBS -volume are preserved and the volume is merely unmounted. This means that an -EBS volume can be pre-populated with data, and that data can be "handed off" -between pods. - -**Important:** You must create an EBS volume using `aws ec2 create-volume` or the AWS API before you can use it. -{: .caution} - -There are some restrictions when using an awsElasticBlockStore volume: - -* the nodes on which pods are running must be AWS EC2 instances -* those instances need to be in the same region and availability-zone as the EBS volume -* EBS only supports a single EC2 instance mounting a volume - -#### Creating an EBS volume - -Before you can use an EBS volume with a pod, you need to create it. - -```shell -aws ec2 create-volume --availability-zone=eu-west-1a --size=10 --volume-type=gp2 -``` - -Make sure the zone matches the zone you brought up your cluster in. (And also check that the size and EBS volume -type are suitable for your use!) - -#### AWS EBS Example configuration - -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: test-ebs -spec: - containers: - - image: gcr.io/google_containers/test-webserver - name: test-container - volumeMounts: - - mountPath: /test-ebs - name: test-volume - volumes: - - name: test-volume - # This AWS EBS volume must already exist. - awsElasticBlockStore: - volumeID: - fsType: ext4 -``` - -### nfs - -An `nfs` volume allows an existing NFS (Network File System) share to be -mounted into your pod. Unlike `emptyDir`, which is erased when a Pod is -removed, the contents of an `nfs` volume are preserved and the volume is merely -unmounted. This means that an NFS volume can be pre-populated with data, and -that data can be "handed off" between pods. NFS can be mounted by multiple -writers simultaneously. - -**Important:** You must have your own NFS server running with the share exported before you can use it. -{: .caution} - -See the [NFS example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/nfs) for more details. - ### iscsi An `iscsi` volume allows an existing iSCSI (SCSI over IP) volume to be mounted @@ -341,123 +432,71 @@ simultaneous writers allowed. See the [iSCSI example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/iscsi) for more details. -### fc (fibre channel) +### local -An `fc` volume allows an existing fibre channel volume to be mounted in a pod. -You can specify single or multiple target World Wide Names using the parameter -`targetWWNs` in your volume configuration. If multiple WWNs are specified, -targetWWNs expect that those WWNs are from multi-path connections. +This volume type is alpha in 1.7. -**Important:** You must configure FC SAN Zoning to allocate and mask those LUNs (volumes) to the target WWNs beforehand so that Kubernetes hosts can access them. -{: .caution} +A `local` volume represents a mounted local storage device such as a disk, +partition or directory. -See the [FC example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/fibre_channel) for more details. +Local volumes can only be used as a statically created PersistentVolume. -### flocker +Compared to HostPath volumes, local volumes can be used in a durable manner +without manually scheduling pods to nodes, as the system is aware of the volume's +node constraints. -[Flocker](https://clusterhq.com/flocker) is an open-source clustered container data volume manager. It provides management -and orchestration of data volumes backed by a variety of storage backends. +However, local volumes are still subject to the availability of the underlying +node and are not suitable for all applications. -A `flocker` volume allows a Flocker dataset to be mounted into a pod. If the -dataset does not already exist in Flocker, it needs to be first created with the Flocker -CLI or by using the Flocker API. If the dataset already exists it will be -reattached by Flocker to the node that the pod is scheduled. This means data -can be "handed off" between pods as required. +The following is an example PersistentVolume spec using a `local` volume: -**Important:** You must have your own Flocker installation running before you can use it. -{: .caution} - -See the [Flocker example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/flocker) for more details. - -### glusterfs - -A `glusterfs` volume allows a [Glusterfs](http://www.gluster.org) (an open -source networked filesystem) volume to be mounted into your pod. Unlike -`emptyDir`, which is erased when a Pod is removed, the contents of a -`glusterfs` volume are preserved and the volume is merely unmounted. This -means that a glusterfs volume can be pre-populated with data, and that data can -be "handed off" between pods. GlusterFS can be mounted by multiple writers -simultaneously. - -**Important:** You must have your own GlusterFS installation running before you can use it. -{: .caution} - -See the [GlusterFS example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/glusterfs) for more details. - -### rbd - -An `rbd` volume allows a [Rados Block -Device](http://ceph.com/docs/master/rbd/rbd/) volume to be mounted into your -pod. Unlike `emptyDir`, which is erased when a Pod is removed, the contents of -a `rbd` volume are preserved and the volume is merely unmounted. This -means that a RBD volume can be pre-populated with data, and that data can -be "handed off" between pods. - -**Important:** You must have your own Ceph installation running before you can use RBD. -{: .caution} - -A feature of RBD is that it can be mounted as read-only by multiple consumers -simultaneously. This means that you can pre-populate a volume with your dataset -and then serve it in parallel from as many pods as you need. Unfortunately, -RBD volumes can only be mounted by a single consumer in read-write mode - no -simultaneous writers allowed. - -See the [RBD example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/rbd) for more details. - -### cephfs - -A `cephfs` volume allows an existing CephFS volume to be -mounted into your pod. Unlike `emptyDir`, which is erased when a Pod is -removed, the contents of a `cephfs` volume are preserved and the volume is merely -unmounted. This means that a CephFS volume can be pre-populated with data, and -that data can be "handed off" between pods. CephFS can be mounted by multiple -writers simultaneously. - -**Important:** You must have your own Ceph server running with the share exported before you can use it. -{: .caution} - -See the [CephFS example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/cephfs/) for more details. - -### gitRepo - -A `gitRepo` volume is an example of what can be done as a volume plugin. It -mounts an empty directory and clones a git repository into it for your pod to -use. In the future, such volumes may be moved to an even more decoupled model, -rather than extending the Kubernetes API for every such use case. - -Here is an example for gitRepo volume: - -```yaml +``` yaml apiVersion: v1 -kind: Pod +kind: PersistentVolume metadata: - name: server + name: example-pv + annotations: + "volume.alpha.kubernetes.io/node-affinity": '{ + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { "matchExpressions": [ + { "key": "kubernetes.io/hostname", + "operator": "In", + "values": ["example-node"] + } + ]} + ]} + }' spec: - containers: - - image: nginx - name: nginx - volumeMounts: - - mountPath: /mypath - name: git-volume - volumes: - - name: git-volume - gitRepo: - repository: "git@somewhere:me/my-git-repository.git" - revision: "22f1d8406d464b0c0874075539c1f2e96c253775" + capacity: + storage: 100Gi + accessModes: + - ReadWriteOnce + persistentVolumeReclaimPolicy: Delete + storageClassName: local-storage + local: + path: /mnt/disks/ssd1 ``` -### secret +**Note:** The local PersistentVolume cleanup and deletion requires manual intervention without the external provisioner. +{: .note} -A `secret` volume is used to pass sensitive information, such as passwords, to -pods. You can store secrets in the Kubernetes API and mount them as files for -use by pods without coupling to Kubernetes directly. `secret` volumes are -backed by tmpfs (a RAM-backed filesystem) so they are never written to -non-volatile storage. +For details on the `local` volume type, see the [Local Persistent Storage +user guide](https://github.com/kubernetes-incubator/external-storage/tree/master/local-volume). -**Important:** You must create a secret in the Kubernetes API before you can use it. +### nfs + +An `nfs` volume allows an existing NFS (Network File System) share to be +mounted into your pod. Unlike `emptyDir`, which is erased when a Pod is +removed, the contents of an `nfs` volume are preserved and the volume is merely +unmounted. This means that an NFS volume can be pre-populated with data, and +that data can be "handed off" between pods. NFS can be mounted by multiple +writers simultaneously. + +**Important:** You must have your own NFS server running with the share exported before you can use it. {: .caution} -Secrets are described in more detail [here](/docs/user-guide/secrets). +See the [NFS example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/nfs) for more details. ### persistentVolumeClaim @@ -469,13 +508,6 @@ iSCSI volume) without knowing the details of the particular cloud environment. See the [PersistentVolumes example](/docs/concepts/storage/persistent-volumes/) for more details. -### downwardAPI - -A `downwardAPI` volume is used to make downward API data available to applications. -It mounts a directory and writes the requested data in plain text files. - -See the [`downwardAPI` volume example](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/) for more details. - ### projected A `projected` volume maps several existing volume sources into the same directory. @@ -564,27 +596,189 @@ Each projected volume source is listed in the spec under `sources`. The parameters are nearly the same with two exceptions: * For secrets, the `secretName` field has been changed to `name` to be consistent -with ConfigMap naming. + with ConfigMap naming. * The `defaultMode` can only be specified at the projected level and not for each -volume source. However, as illustrated above, you can explicitly set the `mode` -for each individual projection. + volume source. However, as illustrated above, you can explicitly set the `mode` + for each individual projection. -### AzureFileVolume +### portworxVolume -A `AzureFileVolume` is used to mount a Microsoft Azure File Volume (SMB 2.1 and 3.0) -into a Pod. +A `portworxVolume` is an elastic block storage layer that runs hyperconverged with +Kubernetes. Portworx fingerprints storage in a server, tiers based on capabilities, +and aggregates capacity across multiple servers. Portworx runs in-guest in virtual +machines or on bare metal Linux nodes. -More details can be found [here](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/azure_file/README.md). +A `portworxVolume` can be dynamically created through Kubernetes or it can also +be pre-provisioned and referenced inside a Kubernetes pod. +Here is an example pod referencing a pre-provisioned PortworxVolume: -### AzureDiskVolume +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: test-portworx-volume-pod +spec: + containers: + - image: gcr.io/google_containers/test-webserver + name: test-container + volumeMounts: + - mountPath: /mnt + name: pxvol + volumes: + - name: pxvol + # This Portworx volume must already exist. + portworxVolume: + volumeID: "pxvol" + fsType: "" +``` -A `AzureDiskVolume` is used to mount a Microsoft Azure [Data Disk](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-linux-about-disks-vhds/) into a Pod. +**Important:** Make sure you have an existing PortworxVolume with name `pxvol` +before using it in the pod. +{: .caution} -More details can be found [here](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/azure_disk/README.md). +More details and examples can be found [here](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/portworx/README.md). + +### quobyte + +A `quobyte` volume allows an existing [Quobyte](http://www.quobyte.com) volume to +be mounted into your pod. + +**Important:** You must have your own Quobyte setup running with the volumes +created before you can use it. +{: .caution} + +See the [Quobyte example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/quobyte) for more details. + +### rbd + +An `rbd` volume allows a [Rados Block +Device](http://ceph.com/docs/master/rbd/rbd/) volume to be mounted into your +pod. Unlike `emptyDir`, which is erased when a Pod is removed, the contents of +a `rbd` volume are preserved and the volume is merely unmounted. This +means that a RBD volume can be pre-populated with data, and that data can +be "handed off" between pods. + +**Important:** You must have your own Ceph installation running before you can use RBD. +{: .caution} + +A feature of RBD is that it can be mounted as read-only by multiple consumers +simultaneously. This means that you can pre-populate a volume with your dataset +and then serve it in parallel from as many pods as you need. Unfortunately, +RBD volumes can only be mounted by a single consumer in read-write mode - no +simultaneous writers allowed. + +See the [RBD example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/rbd) for more details. + +### scaleIO + +ScaleIO is a software-based storage platform that can use existing hardware to +create clusters of scalable shared block networked storage. The `scaleIO` volume +plugin allows deployed pods to access existing ScaleIO +volumes (or it can dynamically provision new volumes for persistent volume claims, see +[ScaleIO Persistent Volumes](/docs/concepts/storage/persistent-volumes/#scaleio)). + +**Important:** You must have an existing ScaleIO cluster already setup and +running with the volumes created before you can use them. +{: .caution} + +The following is an example pod configuration with ScaleIO: + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: pod-0 +spec: + containers: + - image: gcr.io/google_containers/test-webserver + name: pod-0 + volumeMounts: + - mountPath: /test-pd + name: vol-0 + volumes: + - name: vol-0 + scaleIO: + gateway: https://localhost:443/api + system: scaleio + protectionDomain: sd0 + storagePool: sp1 + volumeName: vol-0 + secretRef: + name: sio-secret + fsType: xfs +``` + +For further detail, please the see the [ScaleIO examples](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/scaleio). + +### secret + +A `secret` volume is used to pass sensitive information, such as passwords, to +pods. You can store secrets in the Kubernetes API and mount them as files for +use by pods without coupling to Kubernetes directly. `secret` volumes are +backed by tmpfs (a RAM-backed filesystem) so they are never written to +non-volatile storage. + +**Important:** You must create a secret in the Kubernetes API before you can use it. +{: .caution} + +Secrets are described in more detail [here](/docs/user-guide/secrets). + +### storageOS + +A `storageos` volume allows an existing [StorageOS](https://www.storageos.com) +volume to be mounted into your pod. + +StorageOS runs as a container within your Kubernetes environment, making local +or attached storage accessible from any node within the Kubernetes cluster. +Data can be replicated to protect against node failure. Thin provisioning and +compression can improve utilization and reduce cost. + +At its core, StorageOS provides block storage to containers, accessible via a file system. + +The StorageOS container requires 64-bit Linux and has no additional dependencies. +A free developer license is available. + +**Important:** You must run the StorageOS container on each node that wants to +access StorageOS volumes or that will contribute storage capacity to the pool. +For installation instructions, consult the +[StorageOS documentation](https://docs.storageos.com). +{: .caution} + +```yaml +apiVersion: v1 +kind: Pod +metadata: + labels: + name: redis + role: master + name: test-storageos-redis +spec: + containers: + - name: master + image: kubernetes/redis:v1 + env: + - name: MASTER + value: "true" + ports: + - containerPort: 6379 + volumeMounts: + - mountPath: /redis-master-data + name: redis-data + volumes: + - name: redis-data + storageos: + # The `redis-vol01` volume must already exist within StorageOS in the `default` namespace. + volumeName: redis-vol01 + fsType: ext4 +``` + +For more information including Dynamic Provisioning and Persistent Volume Claims, please see the +[StorageOS examples](https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/storageos). ### vsphereVolume -**Prerequisite:** Kubernetes with vSphere Cloud Provider configured. For cloudprovider configuration please refer [vSphere getting started guide](/docs/getting-started-guides/vsphere/). +**Prerequisite:** Kubernetes with vSphere Cloud Provider configured. For cloudprovider +configuration please refer [vSphere getting started guide](/docs/getting-started-guides/vsphere/). {: .note} A `vsphereVolume` is used to mount a vSphere VMDK Volume into your Pod. The contents @@ -638,185 +832,10 @@ spec: volumePath: "[DatastoreName] volumes/myDisk" fsType: ext4 ``` + More examples can be found [here](https://github.com/kubernetes/examples/tree/master/staging/volumes/vsphere). -### Quobyte - -A `Quobyte` volume allows an existing [Quobyte](http://www.quobyte.com) volume to be mounted into your pod. - -**Important:** You must have your own Quobyte setup running with the volumes created before you can use it. -{: .caution} - -See the [Quobyte example](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/quobyte) for more details. - -### PortworxVolume -A `PortworxVolume` is an elastic block storage layer that runs hyperconverged with Kubernetes. Portworx fingerprints storage in a -server, tiers based on capabilities, and aggregates capacity across multiple servers. Portworx runs in-guest in virtual machines or on bare metal -Linux nodes. - -A `PortworxVolume` can be dynamically created through Kubernetes or it can also be pre-provisioned and referenced inside a Kubernetes pod. -Here is an example pod referencing a pre-provisioned PortworxVolume: - -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: test-portworx-volume-pod -spec: - containers: - - image: gcr.io/google_containers/test-webserver - name: test-container - volumeMounts: - - mountPath: /mnt - name: pxvol - volumes: - - name: pxvol - # This Portworx volume must already exist. - portworxVolume: - volumeID: "pxvol" - fsType: "" -``` - -**Important:** Make sure you have an existing PortworxVolume with name `pxvol` before using it in the pod. -{: .caution} - -More details and examples can be found [here](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/portworx/README.md). - -### ScaleIO -ScaleIO is a software-based storage platform that can use existing hardware to create clusters of scalable -shared block networked storage. The ScaleIO volume plugin allows deployed pods to access existing ScaleIO -volumes (or it can dynamically provision new volumes for persistent volume claims, see -[ScaleIO Persistent Volumes](/docs/concepts/storage/persistent-volumes/#scaleio)). - -**Important:** You must have an existing ScaleIO cluster already setup and running with the volumes created before you can use them. -{: .caution} - -The following is an example pod configuration with ScaleIO: - -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: pod-0 -spec: - containers: - - image: gcr.io/google_containers/test-webserver - name: pod-0 - volumeMounts: - - mountPath: /test-pd - name: vol-0 - volumes: - - name: vol-0 - scaleIO: - gateway: https://localhost:443/api - system: scaleio - protectionDomain: sd0 - storagePool: sp1 - volumeName: vol-0 - secretRef: - name: sio-secret - fsType: xfs -``` - -For further detail, please the see the [ScaleIO examples](https://github.com/kubernetes/examples/tree/{{page.githubbranch}}/staging/volumes/scaleio). - -### StorageOS -A `storageos` volume allows an existing [StorageOS](https://www.storageos.com) volume to be mounted into your pod. - -StorageOS runs as a container within your Kubernetes environment, making local or attached storage accessible from any node within the Kubernetes cluster. Data can be replicated to protect against node failure. Thin provisioning and compression can improve utilization and reduce cost. - -At its core, StorageOS provides block storage to containers, accessible via a file system. - -The StorageOS container requires 64-bit Linux and has no additional dependencies. A free developer licence is available. - -**Important:** You must run the StorageOS container on each node that wants to access StorageOS volumes or that will contribute storage capacity to the pool. For installation instructions, consult the [StorageOS documentation](https://docs.storageos.com). -{: .caution} - -```yaml -apiVersion: v1 -kind: Pod -metadata: - labels: - name: redis - role: master - name: test-storageos-redis -spec: - containers: - - name: master - image: kubernetes/redis:v1 - env: - - name: MASTER - value: "true" - ports: - - containerPort: 6379 - volumeMounts: - - mountPath: /redis-master-data - name: redis-data - volumes: - - name: redis-data - storageos: - # The `redis-vol01` volume must already exist within StorageOS in the `default` namespace. - volumeName: redis-vol01 - fsType: ext4 -``` - -For more information including Dynamic Provisioning and Persistent Volume Claims, please see the -[StorageOS examples](https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/storageos). - - -### local - -This volume type is alpha in 1.7. - -A `local` volume represents a mounted local storage device such as a disk, -partition or directory. - -Local volumes can only be used as a statically created PersistentVolume. - -Compared to HostPath volumes, local volumes can be used in a durable manner -without manually scheduling pods to nodes, as the system is aware of the volume's -node constraints. - -However, local volumes are still subject to the availability of the underlying -node and are not suitable for all applications. - -The following is an example PersistentVolume spec using a `local` volume: - -``` yaml -apiVersion: v1 -kind: PersistentVolume -metadata: - name: example-pv - annotations: - "volume.alpha.kubernetes.io/node-affinity": '{ - "requiredDuringSchedulingIgnoredDuringExecution": { - "nodeSelectorTerms": [ - { "matchExpressions": [ - { "key": "kubernetes.io/hostname", - "operator": "In", - "values": ["example-node"] - } - ]} - ]} - }' -spec: - capacity: - storage: 100Gi - accessModes: - - ReadWriteOnce - persistentVolumeReclaimPolicy: Delete - storageClassName: local-storage - local: - path: /mnt/disks/ssd1 -``` - -**Note:** The local PersistentVolume cleanup and deletion requires manual intervention without the external provisioner. -{: .note} - -For details on the `local` volume type, see the [Local Persistent Storage -user guide](https://github.com/kubernetes-incubator/external-storage/tree/master/local-volume). - ## Using subPath Sometimes, it is useful to share one volume for multiple uses in a single pod. The `volumeMounts.subPath` From c688681d3403db3f8aeabca37faee3c2edd7d044 Mon Sep 17 00:00:00 2001 From: William Chang Date: Wed, 22 Nov 2017 18:19:29 -0800 Subject: [PATCH 12/45] Update developing-cloud-controller-manager.md --- .../administer-cluster/developing-cloud-controller-manager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tasks/administer-cluster/developing-cloud-controller-manager.md b/docs/tasks/administer-cluster/developing-cloud-controller-manager.md index c84b56dad5..9a5d946da6 100644 --- a/docs/tasks/administer-cluster/developing-cloud-controller-manager.md +++ b/docs/tasks/administer-cluster/developing-cloud-controller-manager.md @@ -17,7 +17,7 @@ can develop their features independantly from the core Kubernetes release cycles Before going into how to build your own cloud controller manager, some background on how it works under the hood is helpful. The cloud controller manager is code from `kube-controller-manager` utilizing Go interfaces to allow implementations from any cloud to be plugged in. Most of the scaffolding and generic controller implementations will be in core, but it will always exec out to the cloud interfaces it is provided, so long as the [cloud provider interface](https://github.com/kubernetes/kubernetes/blob/master/pkg/cloudprovider/cloud.go#L29-L50) is satisifed. -To dive a little deeper into implementation details, all cloud controller managers will import packages from Kubernetes core, the only difference being each project will register their own cloud providers by calling [cloudprovider.RegisterCloudProvier](https://github.com/kubernetes/kubernetes/blob/master/pkg/cloudprovider/plugins.go#L42-L52) where a global variable of available cloud providers is updated. +To dive a little deeper into implementation details, all cloud controller managers will import packages from Kubernetes core, the only difference being each project will register their own cloud providers by calling [cloudprovider.RegisterCloudProvider](https://github.com/kubernetes/kubernetes/blob/master/pkg/cloudprovider/plugins.go#L42-L52) where a global variable of available cloud providers is updated. ## Developing From e9ad259492543749487a29b6a2dd34f0bde2ffac Mon Sep 17 00:00:00 2001 From: lichuqiang Date: Thu, 23 Nov 2017 13:42:33 +0800 Subject: [PATCH 13/45] translate doc labels-annotations-taints into Chinese --- .../reference/labels-annotations-taints.md | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 cn/docs/reference/labels-annotations-taints.md diff --git a/cn/docs/reference/labels-annotations-taints.md b/cn/docs/reference/labels-annotations-taints.md new file mode 100644 index 0000000000..fbeffb9587 --- /dev/null +++ b/cn/docs/reference/labels-annotations-taints.md @@ -0,0 +1,104 @@ +--- +title: 知名标签(Label)、注解(Annotation)和 Taints +--- + +Kubernetes 保留了 kubernetes.io 名字空间下的所有标签和注解。 本文描述了知名的 +kubernetes.io 标签和注解。 + +本文既作为这些标签和注解值的参考,也就这些标签和注解的赋值进行了说明。 + +**目录:** + + +- [知名标签、注解和 Taints](#well-known-labels-annotations-and-taints) + - [beta.kubernetes.io/arch](#betakubernetesioarch) + - [beta.kubernetes.io/os](#betakubernetesioos) + - [kubernetes.io/hostname](#kubernetesiohostname) + - [beta.kubernetes.io/instance-type](#betakubernetesioinstance-type) + - [failure-domain.beta.kubernetes.io/region](#failure-domainbetakubernetesioregion) + - [failure-domain.beta.kubernetes.io/zone](#failure-domainbetakubernetesiozone) + + + + +## beta.kubernetes.io/arch + +示例:`beta.kubernetes.io/arch=amd64` + +用于:节点 + +Kubelet 用 Go 中定义的 `runtime.GOARCH` 值来填充该标签。 这在诸如混用 arm 和 x86 节点的情况下很有用。 + +## beta.kubernetes.io/os + +示例:`beta.kubernetes.io/os=linux` + +用于:节点 + +Kubelet 用该 Go 中定义的 `runtime.GOOS` 值来填充该标签。 这在集群中存在不同操作系统的节点时很有用(尽管当前 Kubernetes 只支持 Linux 操作系统)。 + +## kubernetes.io/hostname + +示例:`kubernetes.io/hostname=ip-172-20-114-199.ec2.internal` + +用于:节点 + +Kubelet 用 hostname 值来填充该标签。 注意:可以通过向 kubelet 传入 `--hostname-override` +参数对 “真正的” hostname 进行修改。 + +## beta.kubernetes.io/instance-type + +示例:`beta.kubernetes.io/instance-type=m3.medium` + +用于:节点 + +Kubelet 用 `cloudprovider` 中定义的实例类型来填充该标签。 未使用 `cloudprovider` 时不会设置该标签。 +该标签在想要将某些负载定向到特定实例类型的节点上时会很有用,但通常用户更希望依赖 Kubernetes 调度器来执行基于资源的调度,所以用户应该致力于基于属性而不是实例类型来进行调度(例如:需要一个 CPU,而不是 `g2.2xlarge`)。 + + +## failure-domain.beta.kubernetes.io/region + +参考 [failure-domain.beta.kubernetes.io/zone](#failure-domainbetakubernetesiozone). + +## failure-domain.beta.kubernetes.io/zone + +示例: + +`failure-domain.beta.kubernetes.io/region=us-east-1` + +`failure-domain.beta.kubernetes.io/zone=us-east-1c` + +用于:节点、PersistentVolume + +用于节点: Kubelet 用 `cloudprovider` 中定义的区域(zone)信息来填充该标签。 未使用 `cloudprovider` +时不会设置该标签,但如果该标签在你的拓扑中有意义的话,应该考虑设置。 + +用于 PersistentVolume:在 GCE 和 AWS 中,`PersistentVolumeLabel` 准入控制器会自动添加区域标签。 + +在单区的集群中,Kubernetes 会自动将同一副本控制器或服务下的 pod 分散到不同的节点上 (以降低故障的影响)。 +在多区的集群中,这种分散的行为扩展到跨区的层面 (以降低区域故障的影响)。 跨区分散通过 SelectorSpreadPriority +来实现。 + +这是一种尽力而为(best-effort)的处置方式, 如果集群中的区域是异构的 (例如:不同区域之间的节点数量、 +节点类型或 pod 资源需求不同),可能使得 pod 在各区域间无法均匀分布。 如有需要,用户可以使用同质的区域 +(节点数量和类型相同) 来减小 pod 分布不均的可能性。 + +由于卷不能跨区域挂载(attach),调度器 (通过 VolumeZonePredicate 断言) 也会保证需要特定卷的 pod +被调度到卷所在的区域中。 + + +区域和地域(region)的实际值无关紧要,两者的层次含义也没有严格的定义。 最终期望是,除非整个地域故障, +否则某一区域节点的故障不应该影响到其他区域的节点。 例如,通常区域间应该避免共用同一个网络交换机。 +具体的规划取决于特定的基础设备—— three-rack 设备所选择的设置与多数据中心截然不同。 + +如果 `PersistentVolumeLabel` 准入控制器不支持自动为 PersistentVolume 打标签,且用户希望防止 pod +跨区域进行卷的挂载,应考虑手动打标签 (或对 `PersistentVolumeLabel` 增加支持)。 如果用户的基础设施没有这种约束,则不需要为卷添加区域标签。 + + + + + + + +[![分析](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/api-reference/labels-annotations-taints.md?pixel)]() + From 3dc4ccb62c2a2afde0241f9a68c2b414ac5b0f8c Mon Sep 17 00:00:00 2001 From: Suraj Deshmukh Date: Thu, 23 Nov 2017 12:08:27 +0530 Subject: [PATCH 14/45] Add PodPreset basic usage instructions --- .../inject-data-application/podpreset.md | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/docs/tasks/inject-data-application/podpreset.md b/docs/tasks/inject-data-application/podpreset.md index d2571ab844..51357494a7 100644 --- a/docs/tasks/inject-data-application/podpreset.md +++ b/docs/tasks/inject-data-application/podpreset.md @@ -20,18 +20,44 @@ You can get an overview of PodPresets at This is a simple example to show how a Pod spec is modified by the Pod Preset. -**User submitted pod spec:** +{% include code.html language="yaml" file="podpreset-preset.yaml" ghlink="/docs/tasks/inject-data-application/podpreset-preset.yaml" %} + +1. Create above PodPreset + + kubectl create -f https://k8s.io/docs/tasks/inject-data-application/podpreset-preset.yaml + + +1. See the created PodPreset + + $ kubectl get podpreset + NAME AGE + allow-database 1m + + Create above PodPreset, now any pod that has label `role: frontend` will have this + PodPreset acted upon. {% include code.html language="yaml" file="podpreset-pod.yaml" ghlink="/docs/tasks/inject-data-application/podpreset-pod.yaml" %} -**Example Pod Preset:** +1. Create Pod + + kubectl create -f https://k8s.io/docs/tasks/inject-data-application/podpreset-pod.yaml + +1. List the running Pods: + + $ kubectl get pods + NAME READY STATUS RESTARTS AGE + website 1/1 Running 0 4m -{% include code.html language="yaml" file="podpreset-preset.yaml" ghlink="/docs/tasks/inject-data-application/podpreset-preset.yaml" %} **Pod spec after admission controller:** {% include code.html language="yaml" file="podpreset-merged.yaml" ghlink="/docs/tasks/inject-data-application/podpreset-merged.yaml" %} +To see above output, run following command + + kubectl get pod website -o yaml + + ### Pod Spec with `ConfigMap` Example This is an example to show how a Pod spec is modified by the Pod Preset From 8ae0bd2c14483c8c3a7240a28c67c204c47e8d74 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Thu, 23 Nov 2017 03:00:55 -0500 Subject: [PATCH 15/45] Clarify webhook URL may not include parameters --- docs/admin/authorization/webhook.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/admin/authorization/webhook.md b/docs/admin/authorization/webhook.md index a0ba0f8e38..f451a0d569 100644 --- a/docs/admin/authorization/webhook.md +++ b/docs/admin/authorization/webhook.md @@ -31,8 +31,10 @@ A configuration example which uses HTTPS client auth: clusters: - name: name-of-remote-authz-service cluster: - certificate-authority: /path/to/ca.pem # CA for verifying the remote service. - server: https://authz.example.com/authorize # URL of remote service to query. Must use 'https'. + # CA for verifying the remote service. + certificate-authority: /path/to/ca.pem + # URL of remote service to query. Must use 'https'. May not include parameters. + server: https://authz.example.com/authorize # users refers to the API Server's webhook configuration. users: From 4c083fc73e58b9c800f860cf9c2f8625f82c48d0 Mon Sep 17 00:00:00 2001 From: Qiming Date: Thu, 23 Nov 2017 20:51:55 +0800 Subject: [PATCH 16/45] Update podpreset.md --- .../inject-data-application/podpreset.md | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/docs/tasks/inject-data-application/podpreset.md b/docs/tasks/inject-data-application/podpreset.md index 51357494a7..23fe195e30 100644 --- a/docs/tasks/inject-data-application/podpreset.md +++ b/docs/tasks/inject-data-application/podpreset.md @@ -22,41 +22,47 @@ Preset. {% include code.html language="yaml" file="podpreset-preset.yaml" ghlink="/docs/tasks/inject-data-application/podpreset-preset.yaml" %} -1. Create above PodPreset +1. Create the PodPreset: - kubectl create -f https://k8s.io/docs/tasks/inject-data-application/podpreset-preset.yaml +```shell +kubectl create -f https://k8s.io/docs/tasks/inject-data-application/podpreset-preset.yaml +``` +1. Examine the created PodPreset: -1. See the created PodPreset +```shell +kubectl get podpreset +NAME AGE +allow-database 1m +``` - $ kubectl get podpreset - NAME AGE - allow-database 1m - - Create above PodPreset, now any pod that has label `role: frontend` will have this - PodPreset acted upon. + The new PodPreset will act upon any pod that has label `role: frontend`. {% include code.html language="yaml" file="podpreset-pod.yaml" ghlink="/docs/tasks/inject-data-application/podpreset-pod.yaml" %} 1. Create Pod - kubectl create -f https://k8s.io/docs/tasks/inject-data-application/podpreset-pod.yaml +```shell +kubectl create -f https://k8s.io/docs/tasks/inject-data-application/podpreset-pod.yaml +``` 1. List the running Pods: - $ kubectl get pods - NAME READY STATUS RESTARTS AGE - website 1/1 Running 0 4m - +```shell +kubectl get pods +NAME READY STATUS RESTARTS AGE +website 1/1 Running 0 4m +``` **Pod spec after admission controller:** {% include code.html language="yaml" file="podpreset-merged.yaml" ghlink="/docs/tasks/inject-data-application/podpreset-merged.yaml" %} -To see above output, run following command - - kubectl get pod website -o yaml +To see above output, run the following command: +```shell +kubectl get pod website -o yaml +``` ### Pod Spec with `ConfigMap` Example From 7df85566532e5c24adf10a1b00e297c425ec0019 Mon Sep 17 00:00:00 2001 From: Qiming Date: Thu, 23 Nov 2017 20:53:58 +0800 Subject: [PATCH 17/45] Update podpreset.md --- docs/tasks/inject-data-application/podpreset.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/tasks/inject-data-application/podpreset.md b/docs/tasks/inject-data-application/podpreset.md index 23fe195e30..707a451eff 100644 --- a/docs/tasks/inject-data-application/podpreset.md +++ b/docs/tasks/inject-data-application/podpreset.md @@ -22,13 +22,13 @@ Preset. {% include code.html language="yaml" file="podpreset-preset.yaml" ghlink="/docs/tasks/inject-data-application/podpreset-preset.yaml" %} -1. Create the PodPreset: +Create the PodPreset: ```shell kubectl create -f https://k8s.io/docs/tasks/inject-data-application/podpreset-preset.yaml ``` -1. Examine the created PodPreset: +Examine the created PodPreset: ```shell kubectl get podpreset @@ -36,17 +36,17 @@ NAME AGE allow-database 1m ``` - The new PodPreset will act upon any pod that has label `role: frontend`. +The new PodPreset will act upon any pod that has label `role: frontend`. {% include code.html language="yaml" file="podpreset-pod.yaml" ghlink="/docs/tasks/inject-data-application/podpreset-pod.yaml" %} -1. Create Pod +Create a pod: ```shell kubectl create -f https://k8s.io/docs/tasks/inject-data-application/podpreset-pod.yaml ``` -1. List the running Pods: +List the running Pods: ```shell kubectl get pods From 1b315e2cceb44d7243f447839b1d190eb59ca8bc Mon Sep 17 00:00:00 2001 From: Abhinav Sinha Date: Thu, 23 Nov 2017 18:42:55 +0530 Subject: [PATCH 18/45] Formatting changes --- docs/concepts/configuration/pod-priority-preemption.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/concepts/configuration/pod-priority-preemption.md b/docs/concepts/configuration/pod-priority-preemption.md index fa7dbc54ee..9ee15dafbf 100644 --- a/docs/concepts/configuration/pod-priority-preemption.md +++ b/docs/concepts/configuration/pod-priority-preemption.md @@ -39,7 +39,7 @@ The following sections provide more information about these steps. ## Enabling priority and preemption Pod priority and preemption is disabled by default in Kubernetes 1.8. -To enable the feature, set this command-line flag for the API server,scheduler and kubelet: +To enable the feature, set this command-line flag for the API server, scheduler and kubelet: ``` --feature-gates=PodPriority=true From ef8908fbb18ebefd6f5986a0241694932f5d6d18 Mon Sep 17 00:00:00 2001 From: stewart-yu Date: Thu, 23 Nov 2017 14:56:06 +0800 Subject: [PATCH 19/45] Update service.md --- docs/concepts/services-networking/service.md | 56 +++++++++----------- 1 file changed, 25 insertions(+), 31 deletions(-) diff --git a/docs/concepts/services-networking/service.md b/docs/concepts/services-networking/service.md index 8aae3f98a0..089fab27cf 100644 --- a/docs/concepts/services-networking/service.md +++ b/docs/concepts/services-networking/service.md @@ -117,7 +117,7 @@ subsets: - port: 9376 ``` -NOTE: Endpoint IPs may not be loopback (127.0.0.0/8), link-local +**NOTE:** Endpoint IPs may not be loopback (127.0.0.0/8), link-local (169.254.0.0/16), or link-local multicast (224.0.0.0/24). Accessing a `Service` without a selector works the same as if it had a selector. @@ -151,13 +151,11 @@ its pods, add appropriate selectors or endpoints and change the service `type`. Every node in a Kubernetes cluster runs a `kube-proxy`. `kube-proxy` is responsible for implementing a form of virtual IP for `Services` of type other than `ExternalName`. -In Kubernetes v1.0 the proxy was purely in userspace. In Kubernetes v1.1 an -iptables proxy was added, but was not the default operating mode. Since -Kubernetes v1.2, the iptables proxy is the default. - -As of Kubernetes v1.0, `Services` are a "layer 4" (TCP/UDP over IP) construct. -In Kubernetes v1.1 the `Ingress` API was added (beta) to represent "layer 7" -(HTTP) services. +In Kubernetes v1.0, `Services` are a "layer 4" (TCP/UDP over IP) construct, the +proxy was purely in userspace. In Kubernetes v1.1, the `Ingress` API was added +(beta) to represent "layer 7"(HTTP) services, iptables proxy was added too, +and become the default operating mode since Kubernetes v1.2. In Kubernetes v1.9-alpha, +ipvs proxy was added. ### Proxy-mode: userspace @@ -169,37 +167,20 @@ will be proxied to one of the `Service`'s backend `Pods` (as reported in `SessionAffinity` of the `Service`. Lastly, it installs iptables rules which capture traffic to the `Service`'s `clusterIP` (which is virtual) and `Port` and redirects that traffic to the proxy port which proxies the backend `Pod`. - -The net result is that any traffic bound for the `Service`'s IP:Port is proxied -to an appropriate backend without the clients knowing anything about Kubernetes -or `Services` or `Pods`. - -By default, the choice of backend is round robin. Client-IP based session affinity -can be selected by setting `service.spec.sessionAffinity` to `"ClientIP"` (the -default is `"None"`), and you can set the max session sticky time by setting the field -`service.spec.sessionAffinityConfig.clientIP.timeoutSeconds` if you have already set -`service.spec.sessionAffinity` to `"ClientIP"` (the default is "10800"). +By default, the choice of backend is round robin. ![Services overview diagram for userspace proxy](/images/docs/services-userspace-overview.svg) ### Proxy-mode: iptables In this mode, kube-proxy watches the Kubernetes master for the addition and -removal of `Service` and `Endpoints` objects. For each `Service` it installs +removal of `Service` and `Endpoints` objects. For each `Service`, it installs iptables rules which capture traffic to the `Service`'s `clusterIP` (which is virtual) and `Port` and redirects that traffic to one of the `Service`'s -backend sets. For each `Endpoints` object it installs iptables rules which -select a backend `Pod`. +backend sets. For each `Endpoints` object, it installs iptables rules which +select a backend `Pod`.By default, the choice of backend is random. -By default, the choice of backend is random. Client-IP based session affinity -can be selected by setting `service.spec.sessionAffinity` to `"ClientIP"` (the -default is `"None"`), and you can set the max session sticky time by setting the field -`service.spec.sessionAffinityConfig.clientIP.timeoutSeconds` if you have already set -`service.spec.sessionAffinity` to `"ClientIP"` (the default is "10800"). - -As with the userspace proxy, the net result is that any traffic bound for the -`Service`'s IP:Port is proxied to an appropriate backend without the clients -knowing anything about Kubernetes or `Services` or `Pods`. This should be +Obviously, iptables need not switch back between userspace and kernelspace, it should be faster and more reliable than the userspace proxy. However, unlike the userspace proxier, the iptables proxier cannot automatically retry another `Pod` if the one it initially selects does not respond, so it depends on @@ -231,12 +212,21 @@ options for load balancing algorithm, such as: - nq: never queue **Note:** ipvs mode assumed IPVS kernel modules are installed on the node -before running kube-proxy. When kube-proxy starts, if proxy mode is ipvs, +before running kube-proxy. When kube-proxy starts with ipvs proxy mode, kube-proxy would validate if IPVS modules are installed on the node, if it's not installed kube-proxy will fall back to iptables proxy mode. ![Services overview diagram for ipvs proxy](/images/docs/services-ipvs-overview.svg) +In any of proxy model, any traffic bound for the Service’s IP:Port is +proxied to an appropriate backend without the clients knowing anything +about Kubernetes or Services or Pods. Client-IP based session affinity +can be selected by setting service.spec.sessionAffinity to "ClientIP" +(the default is "None"), and you can set the max session sticky time by +setting the field service.spec.sessionAffinityConfig.clientIP.timeoutSeconds +if you have already set service.spec.sessionAffinity to "ClientIP" +(the default is “10800”). + ## Multi-Port Services Many `Services` need to expose more than one port. For this case, Kubernetes @@ -708,6 +698,10 @@ work, and the client IP is not altered. This same basic flow executes when traffic comes in through a node-port or through a load-balancer, though in those cases the client IP does get altered. +#### Ipvs + +Iptables operations slow down dramatically in large scale cluster e.g 10,000 Services. IPVS is designed for load balancing and based on in-kernel hash tables. So we can achieve performance consistency in large number of services from IPVS-based kube-proxy. Meanwhile, IPVS-based kube-proxy has more sophisticated load balancing algorithms (least conns, locality, weighted, persistence). + ## API Object Service is a top-level resource in the Kubernetes REST API. More details about the From 60b7e3f42ee502f7388bf2662a8f420c056ec32c Mon Sep 17 00:00:00 2001 From: helena Date: Fri, 24 Nov 2017 10:39:29 +1100 Subject: [PATCH 20/45] Update overview.md --- docs/concepts/configuration/overview.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/docs/concepts/configuration/overview.md b/docs/concepts/configuration/overview.md index f9151eca8c..098517d9a7 100644 --- a/docs/concepts/configuration/overview.md +++ b/docs/concepts/configuration/overview.md @@ -37,13 +37,7 @@ This is a living document. If you think of something that is not on this list bu ## Services -- It's typically best to create a [service](/docs/concepts/services-networking/service/) before corresponding [replication controllers](/docs/concepts/workloads/controllers/replicationcontroller/). This lets the scheduler spread the pods that comprise the service. - - You can also use this process to ensure that at least one replica works before creating lots of them: - - 1. Create a replication controller without specifying replicas (this will set replicas=1); - 2. Create a service; - 3. Then scale up the replication controller. +- It's typically best to create a [service](/docs/concepts/services-networking/service/) before the corresponding [replication controllers](/docs/concepts/workloads/controllers/replicationcontroller/). This lets the scheduler spread the pods that comprise the service. - Don't use `hostPort` unless it is absolutely necessary (for example: for a node daemon). It specifies the port number to expose on the host. When you bind a Pod to a `hostPort`, there are a limited number of places to schedule a pod due to port conflicts— you can only schedule as many such Pods as there are nodes in your Kubernetes cluster. From e18e56832a82e34ed2d44a16b330022849d1d4f8 Mon Sep 17 00:00:00 2001 From: Melanie Albrecht Date: Fri, 24 Nov 2017 10:44:12 +1100 Subject: [PATCH 21/45] Added clusterrolebinding command https://github.com/kubernetes/website/issues/6377 I added the clusterrolebinding command to the "Adding a cluster to a federation" section, plus I cleaned up the section to remove redundant text, and turned the instructions into a numbered list. --- .../set-up-cluster-federation-kubefed.md | 55 ++++++++----------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/docs/tasks/federation/set-up-cluster-federation-kubefed.md b/docs/tasks/federation/set-up-cluster-federation-kubefed.md index a615cdbf25..a73e06f6fc 100644 --- a/docs/tasks/federation/set-up-cluster-federation-kubefed.md +++ b/docs/tasks/federation/set-up-cluster-federation-kubefed.md @@ -371,44 +371,35 @@ For more information see ## Adding a cluster to a federation -Once you've deployed a federation control plane, you'll need to make -that control plane aware of the clusters it should manage. You can add -a cluster to your federation by using the [`kubefed join`](/docs/admin/kubefed_join/) -command. A new context will have been added to your kubeconfig named `fellowship` -(after the name of your federation). To join clusters into the federation, you will -need to change the context. +After you've deployed a federation control plane, you'll need to make that control plane aware of the clusters it should manage. -``` -kubectl config use-context fellowship -``` +To join clusters into the federation: -To use `kubefed join`, you'll need to provide the name of the cluster -you want to add to the federation, and the `--host-cluster-context` -for the federation control plane's host cluster. +1. Change the context: -> Note: The name that you provide to the `join` command is used as the -joining cluster's identity in federation. This name should adhere to -the rules described in the -[identifiers doc](/docs/concepts/overview/working-with-objects/names/). If the context -corresponding to your joining cluster conforms to these rules then you -can use the same name in the join command. Otherwise, you will have to -choose a different name for your cluster's identity. For more -information, please see the -[naming rules and customization](#naming-rules-and-customization) -section below. + kubectl config use-context fellowship -The following example command adds the cluster `gondor` to the -federation running on host cluster `rivendell`: +1. If you are using a managed cluster service, allow the service to access the cluster. To do this, create a `clusterrolebinding` for the account associated with your cluster service: -``` -kubefed join gondor --host-cluster-context=rivendell -``` + kubectl create clusterrolebinding -cluster-admin-binding --clusterrole=cluster-admin --user=@example.org --context= Note: The name that you provide to the `join` command is used as the joining cluster's identity in federation. If this name adheres to the rules described in the [identifiers doc](/docs/concepts/overview/working-with-objects/names/). If the context +corresponding to your joining cluster conforms to these rules then you can use the same name in the join command. Otherwise, you will have to choose a different name for your cluster's identity. -> Note: Kubernetes requires that you manually join clusters to a -federation because the federation control plane manages only those -clusters that it is responsible for managing. Adding a cluster tells -the federation control plane that it is responsible for managing that -cluster. ### Naming rules and customization From 4d15b60b5b62414177705d27ea076dec1593d4c9 Mon Sep 17 00:00:00 2001 From: Stephen Gordon Date: Wed, 22 Nov 2017 14:51:03 -0500 Subject: [PATCH 22/45] Add OpenStack provider `search-order` parameter Add the OpenStack provider `search-order` parameter which is used to influence the retrieval of instance metadata. See also: https://github.com/kubernetes/kubernetes/pull/52628 https://github.com/kubernetes/kubernetes/issues/52378 --- .../cluster-administration/cloud-providers.md | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/concepts/cluster-administration/cloud-providers.md b/docs/concepts/cluster-administration/cloud-providers.md index 739476217c..7b31be5cd7 100644 --- a/docs/concepts/cluster-administration/cloud-providers.md +++ b/docs/concepts/cluster-administration/cloud-providers.md @@ -213,6 +213,28 @@ provider configuration: bs-version=v2 ``` +#### Metadata +These configuration options for the OpenStack provider pertain to metadata and +should appear in the `[Metadata]` section of the `cloud.conf` file: + +* `search-order` (Optional): This configuration key influences the way that the + provider retrieves metadata relating to the instance(s) in which it runs. The + default value of `configDrive,metadataService` results in the provider + retrieving metadata relating to the instance from the config drive first if + available and then the metadata service. Alternative values are: + * `configDrive` - Only retrieve instance metadata from the configuration + drive. + * `metadataService` - Only retrieve instance metadata from the metadata + service. + * `metadataService,configDrive` - Retrieve instance metadata from the metadata + service first if available, then the configuration drive. + + Influencing this behavior may be desirable as the metadata on the + configuration drive may grow stale over time, whereas the metadata service + always provides the most up to date view. Not all OpenStack clouds provide + both configuration drive and metadata service though and only one or the other + may be available which is why the default is to check both. + #### Router These configuration options for the OpenStack provider pertain to routing and should appear in the `[Route]` section of the `cloud.conf` file: From ac887bc996f0e16806aa5fdcee9b8651428fa314 Mon Sep 17 00:00:00 2001 From: Kaitlyn Barnard Date: Fri, 17 Nov 2017 18:36:59 -0800 Subject: [PATCH 23/45] Updates to Partner Page and Kubecon Banners --- _includes/partner-script.js | 69 ++++++++++++++++++++++-- community/index.html | 2 +- images/KubeCon_NA_Community.jpg | Bin 0 -> 209804 bytes images/square-logos/componentsoft.png | Bin 0 -> 11599 bytes images/square-logos/dataspine.png | Bin 0 -> 6746 bytes images/square-logos/isotoma.png | Bin 0 -> 12751 bytes images/square-logos/objectcomputing.png | Bin 0 -> 12237 bytes images/square-logos/redzara.png | Bin 0 -> 20191 bytes images/square-logos/servian.png | Bin 0 -> 8466 bytes images/square-logos/vexxhost.png | Bin 0 -> 7621 bytes index.html | 2 +- partners/index.html | 10 ++-- 12 files changed, 73 insertions(+), 10 deletions(-) create mode 100644 images/KubeCon_NA_Community.jpg create mode 100644 images/square-logos/componentsoft.png create mode 100644 images/square-logos/dataspine.png create mode 100644 images/square-logos/isotoma.png create mode 100644 images/square-logos/objectcomputing.png create mode 100644 images/square-logos/redzara.png create mode 100644 images/square-logos/servian.png create mode 100644 images/square-logos/vexxhost.png diff --git a/_includes/partner-script.js b/_includes/partner-script.js index 39357ab2fa..d90cc040d0 100644 --- a/_includes/partner-script.js +++ b/_includes/partner-script.js @@ -432,7 +432,7 @@ name: 'Kublr', logo: 'kublr', link: 'http://kublr.com', - blurb: 'SSimplify and speed up the management of your containerized applications at scale.' + blurb: 'Simplify and speed up the management of your containerized applications at scale.' }, { type: 0, @@ -614,7 +614,7 @@ name: 'Sphere Software, LLC', logo: 'spheresoftware', link: 'https://sphereinc.com/kubernetes/', - blurb: 'Architect and implement scalable applications using Kubernetes in Google Cloud, AWS, and Azure with our team of experts.' + blurb: 'The Sphere Software team of experts allows customers to architect and implement scalable applications using Kubernetes in Google Cloud, AWS, and Azure.' }, { type: 1, @@ -742,6 +742,13 @@ link: 'https://caicloud.io/products/compass', blurb: 'Caicloud - Compass' }, + { + type: 2, + name: 'Caicloud', + logo: 'caicloud', + link: 'https://caicloud.io/', + blurb: 'Founded by ex-Googlers,and early Kubernetes contributors, Caicloud leverages Kubernetes to provide container products which have successfully served Fortune 500 enterprises, and further utilizes Kubernetes as a vehicle to deliver ultra-speed deep learning experience.' + }, { type: 3, name: 'Alibaba', @@ -788,7 +795,7 @@ type: 3, name: 'Loodse', logo: 'loodse', - link: 'https://loodse.io', + link: 'https://loodse.com', blurb: 'Loodse - Kubermatic Container Engine' }, { @@ -798,6 +805,13 @@ link: 'https://github.com/Azure/acs-engine', blurb: 'Microsoft - Azure acs-engine' }, + { + type: 3, + name: 'Microsoft', + logo: 'microsoft', + link: 'https://docs.microsoft.com/en-us/azure/aks/', + blurb: 'Microsoft - Azure Container Service AKS' + }, { type: 3, name: 'Oracle', @@ -910,6 +924,20 @@ link: 'https://gopaddle.io', blurb: 'goPaddle is a DevOps platform for Kubernetes developers. It simplifies the Kubernetes Service creation and maintenance through source to image conversion, build & version management, team management, access controls and audit logs, single click provision of Kubernetes Clusters across multiple clouds from a single console.' }, + { + type: 0, + name: 'Vexxhost', + logo: 'vexxhost', + link: 'https://vexxhost.com/public-cloud/container-services/kubernetes/', + blurb: 'VEXXHOST offers a high-performance container management service powered by Kubernetes and OpenStack Magnum.' + }, + { + type: 1, + name: 'Component Soft', + logo: 'componentsoft', + link: 'https://www.componentsoft.eu/?p=3925', + blurb: 'Component Soft offers training, consultation and support around open cloud technologies like Kubernetes, Docker, Openstack and Ceph.' + }, { type: 0, name: 'Datera', @@ -945,6 +973,41 @@ link: 'https://docs.portworx.com/scheduler/kubernetes/install.html', blurb: 'With Portworx, you can manage any database or stateful service on any infrastructure using Kubernetes. You get a single data management layer for all of your stateful services, no matter where they run.' }, + { + type: 1, + name: 'Object Computing, Inc.', + logo: 'objectcomputing', + link: 'https://objectcomputing.com/services/software-engineering/devops/kubernetes-services', + blurb: 'Our portfolio of DevOps consulting services includes Kubernetes support, development, and training.' + }, + { + type: 1, + name: 'Isotoma', + logo: 'isotoma', + link: 'https://www.isotoma.com/blog/2017/10/24/containerisation-tips-for-using-kubernetes-with-aws/', + blurb: 'Based in the North of England, Amazon partners who are delivering Kubernetes solutions on AWS for replatforming and native development.' + }, + { + type: 1, + name: 'Servian', + logo: 'servian', + link: 'https://www.servian.com/cloud-and-technology/', + blurb: 'Based in Australia, Servian provides advisory, consulting and managed services to support both application and data centric kubernetes use cases.' + }, + { + type: 1, + name: 'Redzara', + logo: 'redzara', + link: 'http://redzara.com/cloud-service', + blurb: 'Redzara has wide and in-depth experience in Cloud automation, now taking one giant step by providing container service offering and services to our customers.' + }, + { + type: 0, + name: 'Dataspine', + logo: 'dataspine', + link: 'http://dataspine.xyz/', + blurb: 'Dataspine is building a secure, elastic and serverless deployment platform for production ML/AI workloads on top of k8s.' + }, { type: 0, name: 'Logdna', diff --git a/community/index.html b/community/index.html index 6ade8ae9dd..e78541e9e4 100644 --- a/community/index.html +++ b/community/index.html @@ -7,7 +7,7 @@ cid: community

Community

-KubeConNA +KubeConNA
diff --git a/images/KubeCon_NA_Community.jpg b/images/KubeCon_NA_Community.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab046414bebcdb4347c1cf5398d91c51ea319cb0 GIT binary patch literal 209804 zcmeFZ2UJwc(lENoISK{@1_1*(M}Z*+ksJh3kuYRtU>GC`qoATFIjA5R1Oz05WR;wA zMuOz1WJ$x@gYn#ZzW?6!|L?u^)_SL5I#gFzS65f}?ylawj|Pt>$!3(?ZLI)6Lj&Lh z0Du@E!l4E5z!(nr2jDOO1jlgzFvmIjD{hB#=?4xjh$8@iKEMwCkT`hfy3I3Xi1K{HQ%%lcz@Nw{P@o@==2#E>s$c4a68a(`Sv;qWjI%X$W zo$m`0(uF4G$+NN3>wYj75=Q!VDG;3x)B8HPX5k`oGAZBhf?~M7rP9Y_l<28$gU_(_ zf(JD{u2UPz7b8+07Dm?gPH(0b)%DG68Cuf*!qvi}2ccLM#JB z7eqdGgG?l!vQ#nV{ zaO=s9>QOiX6b>2^SJ4N2ds+Tu>%a!^S)^J1dRNi_Ha4xHAcD6P(b97N4Pv| z%lj=U@)It~l)Rcuu7zbsK#_Eg^K+jkt%J>ne4{%EJ@I~>ntQF>1A#UwR-&GcQa`V z=>8bfdFV$rKN&{(M>1SuY;21m*=!gg_9R$o@?=pJPw>O%F+T)C9 zZmOr;va55s*DK~SjCVF?cC`Sxl^ksEKyetalD6m=s@+!}ze@cDG4BmY#hmTaPD`CC zzwLIVmVWR{zsk_?C-rh7D)bkLMKzZJSDfIU8fMbH_%7{x-K)yqf=^7(B~2Fc&(2Ow zm1g6#o)muhC1Hn6v^}`ztB_2CS3XaEQhkNtME!FwH_x22=mkEVoHQK+lg0UOMZ@qB ziqw0aF4K4=7^@>-wt7i*=$%pf`6ARFPgXyp+myfERh8LQw=cS1v<@#GFwo9jeSG3` z1iV%5fyKhW4vg=>Ssqui7Vz48I@!hzS1@}IoE>$uF*GLZB9vP_RVb9SxpS*?_2r{} z^_}ugv+ZJn%ci?IJLu#ifba-Ns2Es^k{0%cx4aG*G0>n}$quBjiGHEkUox^8`Rc~B zi~0k_fWS{HOq2l#|n)xA|#v=?EaA5{9kV-WB8J9NDY5`mVlO zHs&(Li&)Ws%-m0E^@*FqlSS>8B7tLFD_f!^<3*N)&rjR%%E+Tx7hJd(cF7ZCd0)RG zwX?VNV$W*@Jk2wf6pRK$ z$`otd&q6Qnaxu((QqgN^E8PlMOFPwD*;CYJVOqjyd$6+Ybp&+tSbN*ev-bD4mRK6? z5Q-G`e+E-Y7@y@88Kog9l7nzHzQH4aZCEzTfO_i$`=e?^ogX%lx-K- zKYbdzCp)h9seGrq=1g-UwHh=TVmRIxAk_EL=b}oNH?L_v(fL}HL)MIGS9thSs7-rA zR#1I?I0gp$a?3h&do=!z!S=0<^plmVp+~??PTqz7?oZo=d1+b>chhWKn# z4l0!SKd*njEyS=?ytRlv>f}Wz;eOHeD`6TQ99zbu9h|NHdOodZ-a5Hxi0CYHi9jGl ziNmQOqr9=GFUj*mu2nf-2KE$PTc(cy^%Cn9p7Lj&kk$@#f#-PYruMhEGnz*2H!%Gy zROIIw^Y1t9*BhM+AE?1Nqd%-S3pCOA1z+$VrLDiXf|(;URyjZ%2rLE)f7lXSNnBga z8ejB;^W5n#UB-BnABt7?9FGI7-CEJSw*{BH-?Y8>;%-q1x3@=%8h0$X-82+}Dq&tC z(|Ye80bFQn^E-PnF-HLB5nyl0z0q>Jdgm4o$swh^=>e?oOo0w2SX$-F?ad=#Dp>0k z1y#CEsD1P{T~^VX_m~&P+!*tyzdSPW3C(PVGY5 znoaq(!m397-<{gx?yy%-urF)ee*DrU+^4U#-VA1JY#r~C50N|q9OtbU&`3(HCb%c+ zb3e3Y=SEFkwh3w3a|0js`)$qS%LLo?@mqCbRU?8*QI-7_p?rCDs{$*uJI^l8;9uhNDeLj3SpE1{ z6R^`4Ftb}GWGf+Tf&DJqrkexsJ=3M_V3TgJw=!BGa5vYt4O)BTU8CZ=?{1#?uxZ>Y zg!jfVFqt9L^+n&KM~4r~3r>$n^Tcn~PJ}Uti+t1(gUg zrnkJQ2uld8i5;6QGue!ISG=J9T2VQSUi(s9(|T- z(na)iFQd^C5x~m2{b{_RB`v+5P?fweoRWcJyy?>>`pr`VQH!F_b5u%x!&-YsK&Nr6 z7-HyCc@M@#V?&B$q+kR3wgeu0_3-rl&3D&Dz3<7&bg@{{PNug*(^}5>L>y`$dc-zR z>zMMRp`#Ug+TROpAzpq!TwYBBAGj2)_^D2zsG9LVA#3cYY6dVw)mYQZL z+dD7?1e{CV)f^j|%EOQjws2EDgoUk{gMt~-(&am)^T(8^t#}UcbZ3G&NSb_v6P)@V zAJ-y@&BLJqJ!)(On*zw3kl+$u%N6D1iUO0^JqDodg3>cbARLY{)Zi!>4DRZP&A`U7 zp@IVvo2EK0t7q$u#gMl}Vas5%zte;vHO(Ah`btLnAm|jhO4kNh07U=>xB&LR6);4B zX+b~~;0OO$Kqw4A0=CEbSR&tvYa)k(|T&H@CJgJh5Z0{pWA3+Ww`aRr>P zB>+;VU)W#@2MdySK*4`-Pj2pN>wvO_ACm;LNRF`;G>p~1OYSljAD0L8eoKe;59w$* zp==Rw7cl=67E{3q1^?M#P$1^WUkP1n7mZ&D1teVIcLI+3ow#c5;PNX+(;9W>S3=3r zLGf1tl=*Mc@)q{iKLl~yJOI#Dkyik@!R`|QT}u`gON6VrEMfwiJa#Hb_`kvA9sV6p z9%-p>07oga={jKb;Fptkuw?l=xUP!>>KLx=?jVbN{}Z3|4$K0DKq{J{%&;vuW>VW) z+vTSQVdGd_FvPMAT!mSEC-X1W>VwmNnPf97CW_ybPy6RvA(ZS!Xa+0P7+w_o_!afP?? zod+ClFa)+i9Fb!PR`Y*Aj%j`a z(*Sm49sRAto5yDVZPwBMN#3z6u%xk5AjxqGYt#UM)5rebc*i*W#~I|`_s`$`V>q@| z*mhwxk?0sgd<^+9#&KoAYQW!*K4Hejj*SlA`-lOX#JdT4-z9@h0$76vel8f&ffJc4 zU=Gef7T|mY2TZ}A8R%nEj^Ljwn6?F{IS&x`$8g0K|K<3 zxfnWJ#SUMbztlr;oCktw!5`6aLQV0Hx`?ci2v?`SfCv#tTWi~2GqaK&mb%t445UF} z=88h7z~C^X846|z0swsvr=JfY((lMv2sTH}(V7Je{-16?o-5Mf$D`~=r(lKuSBQp- z_0PxMcN{`92b8{<^d#4%_$T-;$Rsuhq^F#Nt@TeyQGIW` z>Q6A(aw1EZm6_}Dq)l=MhD7}hy5UdoU(w0TtrZXs2;?8arTI=@UgcK?SOm~Sz_GF> zK_Q&Lg@Oz0&smYw0h~Vn4N7i)Jl*~qoDA$@n}0<=9+j7{6@gE8P@SP)kK^A*Aa=C^ zD%|(k51;Nhg;i+U<5F0BfV2kmuo6!Ie`mqy1ONzvanMkB8Z`XG|XJ=|B83j1IdEL(?VLpv7tWF8g*Rv_q{X`_=>}E zJC7!5`fN}rCrLg&xC^ft_GJWK3xp$|yO|T8053luAO&@IGPAIUp;*je;I2`c^-Fm* zD~qkAH0w1H4So$L1(=PkswWbr=c%c0;c0InVaW=WVUco|ba!-egrUq>+#Ma@E|Tuj ztjEM9!8jJo$I5byg0h!pJ$_Yy#YjV&MFD|?v54@B@>mE62(XAr@Ct~C3kiyFAHNd8 z$1lMrz|X@Ez6ZfCDagyZPhOg}ESHkrprzo$YsFr8{8F|ErGqYhk53FgWU0aZvRC z>%u?lv9$Pw=LBxDkHutZ!3T4IIfC?DKn)Q1)gY&zuc-Vg@|Q;a%05;bYz3gSB)^*# z%p4RE7Oq&5YKqdVuCBJ0k|K(N{NfUV!V*IA%8K#=0ulnka^fNq{E9*XBK+bC;y(%e zS@638S%Ow~OUYl=Ns3#Tn+aG6nDOun^Gomu2#A^Um|F=8@rd&a3R+lMi3*E~iTZ9z)>B0?hOVrD`-68tc89$_m`HOxeW`FYGl1z|!0!j@K|Lj1?& zB^8h`Gtj=O5876LD(&y%gui)j=Z{h_&?pO&X2rh91G2~?AfgYx(IW!B)FZ~jFCxkR zqXG?trLC36zoY(m=jSh|;25$54ZZ&n+0sJN3W0Pq1J%ja(aajgXXga7W@Y&;zhi3y zSTo3;5OySd?>I#m5MJF+~MM1z|Y_ehC2qB{6v=er0(9VI>7| z5iucgA+eujzgw*SchrdQSBq3_UBJ%s_%U1P!JL1@9Be@b!Qm!pW`R9pkY;r;0~?O5 z84LVBX*IUI8)z5*Yrp?XXMV571!0A9Geg4UtieI@Un3IiV?FsFNm_o_kDp@tli;t~ zSpN4&|3~@%cO&+@c>dp(KOeROzAG2s_mT8l@4%smvPC(-esq(Z1L}8&fe#Hy2e2o> zd5PzTQIS>VzdnAHIl|$K*8)rC=R)Y8@E-~MBY}S; z@Q(!kk-$F^`2Udvew%1uaBw5w1{z@gxPc*yHS`?c!1(k1jQJTkdje@ul?YGcQEj<9N`j@xZ;4fGiV5C3C|IoUQ$kWz?TV4{b!!`2yE|^~9-a>$`9FRV5D^*m{Kd=Yl+@R0=^1Yd zi;7F$m6p}k)i*RYHTU-Q4-5_sPtVNG%`Yr&Zf);;+uZ}3kG(U3k4J!yk55QQ;0Urz z1Kt@S5Fi9tPsr&I37XM46U*Oc3#HdhG(RaslE?m`O9A=y)TFO4cy;8oh2mOL{soaU z`l3pf7fD_G!j(~2ehpx*hGGvM9y7eb!4Q#Bh`l@#`Th3DC6#Md;=eAC{JuS+YGmX7 z_(l4=#=-e-5^Bb_9#39olr{}5>~cz8xo+nf5dEgCd3bT}ua`VJ(c@)1w{})52P*e- zT)+4%ee(Lh8GuS3+E);(5{h_7PA?wyCecqrD$61{A(cFn#}T#7N^0Xu7H9n8p>}(7 zic0fnM&(A-%E`9ep~3;hlNJiEg&}l7XwsY&_J`WW_qcD2*4WZSd*CK)ZEY^ri9WwR zQOrDYmsvo`P^nq%MU!f1gF#4^CSC#6Ip644Ld0eSp$d>pAt99dP>^ZC_K1BnPci3M zvr3>4snj!~7wbwHosmhsukx$}5aQe>%cfe=#CirmP|qS&w$#BMr5Lx6f*vOaZMv8T zwNC=T!!$@GD`m2`wyHGCYgtu&UHvltYofipVBX}jUXWx98W962CEM+}luhTyrH1bJ zLOkS)Hq&Qr;5aR7Gz_e*3W?DY+0rW0dip6GlnJ6}ZLcNXKurZ^#swv4=F@pgEsC*c z4o`UAH>_rxCz;;Y;9t8hs2^shwjoorwcr?$Z`{m&zc6=m5|gvBX?aIxHApo~h;4z# zTHa$I3pYq3t5KtEl`6OH@Tsrr;*FV=^~(>4jW9k{7RhA6jdfC-%^xbc>_c!$b79?e z^f>rN)b861p&IV4EDfCbq>Nh^lHRi9b6cK*nWsiCr8}WccH;)gmdqV^7t{4xFd3v= z*JfVzJJ{@QWWS_pHeGdpfhTPM*?c9z-slLZ^x`j03hg?-r7Ap6-fm%c-mMg}T1q7b zoXBuU3BiA`jzE0H_+D1K1Td+L#J&pBaQ8R@GUvKUGfy%4Xv>s6R>H0GmftDBOb1-A zA2%U$US8xNv%Q$$_$fN)aq^+*T-wGGzW$!^3!e9dSE20`3OiCM$O+$x6T1*Cc=)X_ zc9cbM=tfSgx94*_dPVeUGy4}N^N)7c;?$F++wMVPs8INJ39OaIB)3+?)8f~UfNRSO zt8vQR40VHx{UiW^BX`od6kL5zBdUzK@mNAFWv6Bv3NB0{CTFha)wP#xQdh1clsZpCxBT$+d5B6l~JBJG>6bK+;I#s&G+lY!2g0n@Fji~^=5 zhx!|fSKU1qQqIwh)j1F)Yi%RE>{x4$0C}Idnxruoc~);n}gm3cWdi=P~eYgMm(@jA8jdbeU&FNVGBSHd|hn*08t zQJ=SSL#BFCJ-7Utm1uR@@QZ%!M!PXnp&KU-K1ig~&l^oPKScP8G~mp0?dm;pz76`lTYw9eB|)HTu^G! zx`Z46FON9Qy*rybyz4ouVR_kUvjMWD8?k6Gee>P;7w1@(B)$z{aL&jv?0P&*t=rix zo5%TWLc0PFNk^^4obR|LvpZCd(7m~OD!ib#ATEDAK;Jc!W! z^~OolmZYhYM2d`ivdsZ^;lmM;?_^#xSE|Hu%au$Gj;(a`E#x@5gVV3S_O1D+lX*!4 zT2y?oKBl>wsV&MfAFlN(0G7S7UG=X!f!-39@eTCW;mhlgex7~k(7Ydlsf*fnlxt=# zK7M9*)A#XSiYV>9*&XtkBr|UurKkK_OYd2C4!lIz9@(Ha_aP~TlTLWZPM*KUu!81o}4F}AzWZRGQAP8!tdw9Tv^Q7NWXJDX7 zA^w99;fKBUjvP5liPZ&ZzR5AvDl#9Z7#4Jbx4ers=7+Dmc>f_I{ooMVx4y7+@pK4h z(sQ>bmOAs4&BfiB$kXY!_>dxJM?NJuim-PQvd!%7TK6O^&DUJguB^Q_>(jBNTPdP` z!o~!E&o#DAG7&4d8sG4MbnAyZf!AmHIqesMp-_SM9-9Wj?(gY0GA4ud!l%7GwKP*7 z6E4}3;w$TAgm5_Wnb$skEGk9Mj`lBCwMiLh>1jLy!m6j|3puzW=+0$ab>28w2$8Du zX-~TP;CV0V32yk5Hoi^34I;6=7Gz1D$ytna_!S$KxrT%I#g6C70nvVTuT`Go%!M~B zZ?2A*MYFMAU(LrY(>Fqq?8&}6~VS`6h7Yi8Q0AtcENUdU~Y1x>tAVZCrqv@ z46|f8LlHGPe*_qyx2pVxGw<}A!7bc(_dut+!sLfra54{M&@BV0MeLfzU zx^y>Q;xQ=(sZQME+uUx+k3Ir$re+Q*s$04o7C$WA!T@V&bEaG5oBKqM-}=2)py z%wt_*5XxCRY?te+%lRhLQ(U%~i0g;pJ5-qIwn*u7FH$`M_;W_04>Ef&Qsud%#^)oc z^Ldj3?%Cj*gw0Uoc#ERlvkP( zq|T~>>OL?y#FyiVEM*^j8bj%^Er)zxaO$CiUCm7lzL`Aa<+YSx2j$%6uJ>GZK{2_5hN)%8p{%MxGKRFo|;1Kx?Mq zuQS@_^?I9XZ5=+|)$pAcN$P=E4`C=@jn*k~>Fi7LXi*D6)YjDbt!~~iKoJ<)^!H1y zIF;lP9>gQ_OFN6c`R-Z8`5zid6BfoQzalvTbdCUv*9VQ{4|qdvni_L9%bhHX3AGPV z^>JtJHHxOuw&Bp)LWjRz6-Q?tDy+;iv?dn@S}+ErI$%;|eBnm9<`vgx2k=6-wmBc) zXO<&;C3zu2V3P&)+_f;P_8q`S6x^#HtdqO>)bpL__GnrOUCv&0pC*$qPOnSNq3Pnr z;!Vku!QClD6?RkFfts1QS}fe~(IDcfwdJ>Z%1w>f_+(n+csQjTLtd(0k`q@cKceq`}=9%+>f-yot10Y5(=i z>DkVuw!ngtsKfWmq^lM6U-~~W6&2*i1e3&e++Ny=JUU3yy-La=Lx9L46{2}8AAb`GHOiR+8 ze|x%Ma0$P_X2w{q=m^O7fUL>1DN8zRPLWbwStvE;jeg8<-#*6F_f75nHt?pW$#~|z z;PB{%)$G+%?T>e&O_2>H6oDUzm{^Vg znJ0YjGZ{QKO-d`j+$N#;h97cv;7}aAW4fx#2x{w0m-RQvdXHSw4`TRZ6B}Cx{0Cl6 z9(!AQ+MHB3WJN{U?`hO!sh{2G*jDMD3X&eDXHG$lA=OePYZXkwjDoY@Lu0~-x)0E~ zJI-m30m`Cj$;lLEf+5+HFsQs5bi(^Kk2L(P91D)_VVpw zs#Ymw*})NG%3E2J#cmq9#eLeyXpu2k6}JT=wU4Z-v=>gq%W^0Y6`P0|4f4Q0hiJav zR#hGB#cbX2=I&nYwQErAis9{UxTEtoF}C14*)l!-!88LW$?8591&B|_ESN3M9-MXg zGL)FO&bI4175Zw+>;-iFZK+lwpZ{%in($mGT;k%G$hgmQ{*r{4gUT~Q3@giA@8h0) z(Pmfh(Ro={SgBjjh<4D_5B+xGW6j?F%iY#S503+(1`YI>CkJ;XE3I=D+W(-EN#o0l z8ng8DMZsp7p%kTO-<~D3Ds^$=h+f)_h?dzh`0TXrkxp44)0G0Rsk zG7*^cpwDcNMmSq=u_fhb70}bxHZiE^O35oYouOB_abnpxfBjpqvvEqPg0Qs#P6oJ2 zqVVJn`@B1~TG9oV*4mYH`#4czc+o+J@uVi_T+r#@k!h;b-t^6smd5Vt@U88j^?kdt z(X>;=uSM8rynQTk6iV>m?1kk55*ewS)di`weKbda>teW5s%UXigyE&Udt;)smj>FO zLM&B-_uGX^q7t0b27)Aw>Au+7jT>CD-ogtW+TJ|9`TEO8wR`CwE3XP<(`($IQC?2h zfJVuk3{l;jFAhJHep1>3s}90k?jU*Ms;jz{kfY?~y?n>zMuW@a6v>GAc$!_vOt+>V zM{(IWdO9vDk=9?FIWc*i$cXdq!&iPTsf;E24Fyk@cQh>r9ToG!rReBWISU(>7h;~K zsP~o^-qgvKd+n+ErE05oMf$_b(cX;j&gR}3V0Vnwuo zwh@zlwL=7Wm(mU92g8-|~X2bFczhM%E*1)jSsC{1p# zWxM<6+`a!iZ$Iv?E8PZtjRo3QxXRNP0xi8D;!zf0!x|-iCWHTL9eKE_a>$-+-cInH z{`JO^vw<~+#-pX|mQ+{vuK71o7O1$E6%6w_lzKUsvlf&X0h98|sQZ43sYY?!o|g`X z%1d}>&T_pL#W!dWdY2!%B3+HYa-xYsL*_LD&vE<}3JCDP!$ z88wZ!O?aYYT0>ePG%M}7na^NLZj3RVUi55X7sySEbO)*)-+N{+N@;1~sw69}jn0ti z<1w&#;By1ow~dONGG;f7)M`$H797U;F%9h$p|Z}f!VVQ1m+< zVfs)U*iF_PK%c&Nu zK$d-&plg(grzrxN#CY3Jl4l9Jqab&5<#tRUD4hrCY4-*!GE-7Eubz7yCzc~vr(5qD zb!m2;l}dJ@&RKN&!&4HPIYq4d`sbep*-*GIIYqCHvC)93I{M7+!o!itqFp{qB zWsjw^F%!3~4rMCO+#~h9TbNJzp|2{;Be75RU^PB7?R2A9k;9^S__xYY`a|35q>-V; zt;=W*Ztduz2;y53qYT`>SBalVJ;qPGPk52w*5{q@U9Oj~nZst4ns=|am=+Q()Yrom)v$i6Cc2bcO ze%hsBpUQ(f4BVXt%2X*b6D4qwMh6Q7f8Cl>a8ldL_B$JSalzgsK5gJIxJ1Dj@YvF& zaGC3=8VUJOy8TJx?YX9&dujmZOWGaLq7M`3inZn7mnUim-Bg#t&p-=OOzyF^Tj8bv zXfvYBhjrEAXOt(tnms!La!`!H?tYh2f@Hj}l&dd|WSi`XWUtf}C`^RNeT z!_&2kuzw=FVIQYsV609O@%CXh5~q3~P6hmW1SD<0q1rpv>+QoF%vY)dt+{wFk)=<- z&^H%hlksyryu8<=IroUGoAoxIbe7GF&2F;|qN8`=aPz`k(eCspNk6@-*Mjv&c1T1= zo&@{9x!BQO>2&qhY8H!%28Cb<_l+p1X(A(DLvB%Zv2!4g+uejcUQdDW7rbLh;^~sk z!Dg$Znb8$5AD_K>?k4NFUdO=F^4>_u?wvu7kP82fxo!zDp8DHzPRVK4eR7jU?V2+d zspf73wpCB0g)XmB1m7-7^D90F1n~qbh zE)Z|!50G<%D zB@Lg+8QDKe7TcmTacO;Mn8Dbd{h{qtdX}%K(|UdOYGpUyh>uw=|!Vs8{SiP4F_!Dvs5(Dm$}yDNlI+sppE+ z1!jj>OS=3D{Uw1Y#lV0JQq`SX^EqBSx0c2Z2g)Fq5ucwo%iJIFQgPoYsUJIBxS2SJ zyHDkMXIyg|a>KE5S>|Irhj;R;vCD20&qn>e!7L4+)4FZ@v?=k45%I38_n?2ADRlOA zkDrxMx*OUI<3}@qPZo#Hjss1K*RZk`5QDeL=|Buo4|Csca1Kl* z6%kJA=~i0{yR<_t~C8;ZO*O`^>8QE>HT0go_dwo zE|WZyMB#qz7ScS~Td#b^x18po(f6m$OWnq2dwTODZw^n0AcffU*nrf&ayVhrw_ru2 zaeg%Y`@_PG%_T;Dajx4zC%TR1?L*Be!x37Lr$<0wM-j`3hG4bF-L^AYB^bU`!VAVW zuL_Z5Ie{a+>h#ukE)g4^>aJLG#=NU8o_VZV$d)?d-7_NYKEmq1(u939WOi;9yGiA< z`xwi*>06(|SA459WoX56*2r&nZVhS5iR7=(kyP=>JJR51(Nm@qzBrx%>2s7nE3SEGf+uZ_5jy0<&-s$tTjQ zr()1~+X%CKgxfmj;PQ@Om=ecXz3mX9SxkVSQYujmIBB*}OK<)fZMK&SMP#-nlalAO{E2bG>@Z zH>EJqhGhL>c+vteZ~ zAe+XggP+@U%Zy1A!DcV-l0`;vOez5$PFoi@8jS6nXJe=IqgYM)lFpDn4`Dk?drF5T zy%*8Y>n)u;$9rX_a1h@1sDsXhlZk+uO<(s>a`0Tk>tzI=#%JXL@{TKOIh0&ix+6ZT zP{kW%%tV|-;`=r)w{}qTEt<&7b(na@+|Ir{TNl@<3S#@^rpkKvXrA>5bIi z4()GO+y|rxY5tqPY<9!=-tJoM9hYu5tKC~d5Nr@ck)d-5C zW0tNRaMLYlJ`)o>bL-450B!etJ>(EzhElo^ZsUHX_H|IJ4iwP)Hk zeTgUie0-`+zwWSf$DcaUSMar(7Ci*cV3f&fi?h=>Ud*ST4(3Nm!fTx|%-!ONBBw#4 zs-(9-G&*yAiCm$#n9GTxMx=SHAEI}sL<()%P}o4f?}?Nbeg)Y$0`mH=(F%=nU8bg2 z%C0MNBNgA6(?Qz+NvWRnQ@ia)84)?8? zo-@7Sdacx#J-InS55sjJ%{ea`2|Y2ek6P1g;Dh5J#X)OC6(=5`wwj5>2{qq zw?NZoM{@R?dN22swf=0=Sgvi);ICg7Ykb%p5!KCxusC}A_BYSgB6F3A)JPqSgQZ5D z8<^J+`T<@N1-C~#>m2sJRGoOs zQF{h^{Q&8nkB>J_&N(Y%;tT%4Z&hfPUNL}sfJl?1mkAB&HU|zzKq+(RV%{?rqq;4@ zsyKz~4MAE36mR9&(?swfYv{#}MwHfOJqHVp&6)eV@#jFT5#b2Gb$_~1{{Eu~W9o0s z_arnNvsHCVjsR+RvAGcGCzv?-_W=vw@#Ay(2N9esEO>KsrlwawtKi!DLQxt)lRWfw zg2D;=acxElw!<$&DQd$wO#JWrQ|5L-qrTtUt|w-@1OUxfn&CZE<69nc!_TAR3oEKu z^__E=3;mRp)#%dp3NW`GYQ)=QRKzLjw&SYiNAjUS`%FoweJ}6nQ%G%eT&O-- zQh7y{2omcJ?F)Ju{_Yad{d7j6oNw-57pfAU`g*fCB zkJn^CO1$R)60e?4`kWR>c*yLp{z&INbzaH2s@F$=CRMT5J=W?MpkC}&TdTrxUy9s@ zC}0%8uWQox9I`%LV95q>g1IZG%19Nfq4NB>7K*b=?d+*=J+(8NW&XrFf%Ix~Px!n5ZU?Hujga|fI$i(9 zwKLF`jjaWPcb6uMnAtjn#nV>y2?V;g?`wteT~VW$*8On5i?t*rK@xE>9i45zQCG9W zEnKCFUiTQ-hLj}Yv-nmfrFybwAqKD?+UzNQroP6s7=^3A>q8Fp+O4GsMNMi2DDO2bcI+ID_T~K|R z(i^3U_X3*i29gmEpK%4BR_)+U8l}p(xU{OTpwDg?aaaW&Yg2ubqAisrPAAEgZlV{JukhIJX!+6*KySo2Nio(^Az}T^x%`glTgTcF)}Dj zmS;=b5*KQ0)jMD_Vo=Q%ig|C0=MxX%YmugHYnT+qpdix=9GnjcFB_AcB4Z6(ObM1R z_pQ3fzOL4TDJh<2p9R^twy_W>OyEws8$2yzIu7Z~m&3P%EFV;q4MKN4(X85le1nQ!V zUk{WswCRw)86M`w)2v@wMmW~e=kJA1HC0&b{g6(S-BNYwfc9I{*9N=;p%lqEre~uf zDC$l)Z&Q29nfBICp-NL$H)dC&<2WM{!)zYJn<+-PH_mLSTzwGcr2fjgcDCK~-I|9V z%B|=ccgT5N;wB97hg2Ke>>^cVvbfZhYU`2h4;T(Oeqo}^bEv)N-G@XiZ@|OShqv`e z<7Y&ow98V0r?sxM(EDeYwv;BHr|L6K4viQIBLPRTRNfJAUhW7G9yy5RsG#?U)JpD# z%WWDsUQx}@C*&+MS}3PV4^`;};NFeT#33@^7D*;H!6L!*o-yv=r|bQAs@fXS4KZu0 zm7=2>l2xYD&L;4#l`FSvQ_9g~l76@8&b#X0;XFNbKNs?axn`tO@?yPk@YiS*-Y5E= zI1kS&+eNRyVR}}fzZDy<--S`_VS6*L*l*b<6o+(4&zD&uI+u508Js7 z>SbQ(JYMv)8_J&yR+29X5+|PP@q))mwsOmLLjAC5vrg}R1moUsM!{NOhm_y#h*MoqPuL;3Qsw@g5PG3@X%c znZs!2dHUmNG_gDs+dKPI;sBlVe#a%HH+t)BUdXblnI#}VI2Y#daTI8ncih~$Eqi(j zlQT0=R@nWw_Q!y1_*D7#0A0efNt4eBgZ2P=& zS*>Y-E^aNUNJC?^So6tj}mQr$XsChe)|Tz3oEH-p8MquOt)1g;fO~9G=un?UE}AgO(x}T=t%FfL6ZJReRMEraYdsZ_MWp0{K1p zUWz=?EzA&3Q=U6DdRa^Cae!3$$8Z&fmu7DQRj;Wd6B`z(Hg_mLA#bf&+?nk`tTPjs?6SiMB6;HPGxp&3v;OoF1luWt4zXt<7)f34Bj%MB$Y*6(#wdR77?lV zc(T)h*)UzbM_LQZSGwvhrKG>D#+nQ}vLg){jO8FQd0O1z1#Nol1&yOOTgr<=9GhgG zp7?gKvD#H1`Y?!&w3?IZTU7<1qeO?-h|;OLfe47r$Y01q@iDp@r!UUfW?fHYeXaE9 zRRTWo=cwWg{P4lY-9o!Elj9y@)S_(#)+&;7p|STSlO%5kF9b}2715nGO)bR6+07lcq=kk~q3NHwB0=vmNl-xPuzdbaPjx>+CX z?e14n)^f(^ZGQLXmk)+22lr|&x5T9*3%kFz(T>t`d)G4|7!ZL@goz_I!OvB-=nxwbMMgm zRcfWZwhd@lO6(N)VynUKT^&#LT<1dVWz}3It?9Ddo9Zdb@k2M2j{rl9+cIejE5#)l z-L%zkf$kS?r@Atx6Y-szpwDHCkAT*dwzzJEvK_;L4+U)c3=Z|5Yb{_;&Zu+P*}Z9; zRSvb-j1@bl#R#!|7})B6RYxfNfF;_e73GX5UHN)%=ad>T-daf7HY510=~G?SO{?(g zPgYtJh4rRg(; z=HeE4#oPv6ZP_#N5QE+Xamwm?gp!dJX*P32~_vAt`YQ4{M_h@q{nd zv0KJey*yc`dZ97(QPjtHnb2~2cE6fL!(xA`=;5``d9ME#O=lU_ibxNo zTWP6*NK1E@v~&uLNvD9Mf-rh?cOxCrozgP88I1YdzyI?*Z+OAMc8uNIb$_q(bDrnr zvxhv>D?mneeqZKE9~Y)j<#amDG&uJpS*ofM z6826dDhNS~ca+1-oHaP=+e8x9R_(po?O5{DL-}`QURavms+o$k<17P>iN3LZ-S5Zc z<3o5C03or3yZ-|<(DdK+JKq0x<#Iku0;!TmHTGWwJPqic)@)u-vTRhCmk4t&=Y5lh z5gxnMIWkoXFs7mUN=i7;<P`E(w#;LcqoUx$_i_bCoZLtB z84UIINe~+yRD=G~gV-}7ZnkXVM^%kdfJ@@8CpzwME4x=!gSdyn(F?iR2qICzEc{&q zowDWy=SG00xl_jvCH=M-Q+KG)?9QhRgW*GSKttjw0{qckzq{~-=) zlADUVd_u&%v7`iqLUE^Ja_J6-BnIrK- zW_Sc-UicR6|C{(9|B%-0H%Wngqn)bsH5S#)_mw;z$v5G@Y8WU3O7?X<>W3A@WaW66 zRbkGHF#$T_ZP6)Wu87E9{$l~7@m~>Rui^kI02K`2gK?@}$ebRdgn+TZ2KC}p(_<11 zJsjyjCqyaNxUTf-8n@jc;Z9rLCP(|UQxk?%T**=i2dl}Q-Vbm4xMUqz8`&vXPc9w@ zoE1ou0^p(u#$k^VN=361?jqdd5<1A+l`TZq{vd3Sso3*LUJLQL=1D(PEle;j9`ZYUi%8Y_%28Q%66u(){;l7`S$4CUPwOzYZs|E6 ztAO@2y+DUf`$D9^+r=(XTloq zztZ6Wl*of;mjm7O+H{0v{l(c*-a$tSE!zn^$5+?N>{`ywKj>Jj06WgnoLvZ}dzm@C zkZ$u#x=9FOVt$q$>~6&f?@ZP&^%OR+Hf2kbf0er8SN8rNC|wTCqSOdUNtJeVPRZ~* zd-l=4`=%kIe932d%;umiZ;6_zPURvt!^>;4v{U2QWU$lfiumt zhF?Ji%o6)6guqbNvCeClSQEhfspAJkEWqo+`)n2&Fp=H8(>&pqNYqe6DOSF^LOP}M zX{7w1V%4~7vPH>8waqn=YQz!mROBFfvR2lXK0!8$$MY!q`W$eigdCv1-{3E=y{L~k zI80onr9C@t@`A{ELI!BF!^(fDjUTuD1O3R&UTQQxud%OQ@a)=hr?CIQn}i+BlayPY zms>QUMfZXZxQq*Ps5$h}FzlC4I|o|o<{7%mtDpzzIMX56{&#d&RFkcy{s=j?;nE_= z`4GFoPc>w0LiccGX0a`|`RwV8&h~jylZcOb|1iO1Wy-_6YhX>r0LNkc$`sMvit7$Q z-h4%$`&w2?XlgoZhl6WH3A26E3yS!(zav{6EhK;r6*p+;)RKdZmtfBr`)=rJ_lX>WGbSv!p zZvWU0LlSZ#!+374&9mV(wI7o%Aj$?cH&`8J^jG;+v|intS`4Zr__&}HUjJqcw0ye% zO|HZ9C=z_;hLHj!$erD(HRd}o;hFfYk_XyLmkV>VCLk|X(%8jyDSNDaX}rD$uLH4fH1y+)P!>mQrOuV|rY8|GKu z&fOV=yMD^}y6Cet&@W`@EHS&d(%W<`I6lNJM>jo5Q!t!Y5<07K5!@pMdE$XzNX1^vlK98E?~}c6A&{Rsjn|71@8bM%c#$sKn|S0lQ^YuX5tbG&spvhCGr1` z9+s6nT+33lXFB_^%~)D$Rh!IPhRL&Mdy4H**k}?^svsV5CA64PvY2U-YPV>{)vTyp z?nL`;Q1pwPiHPMp`B-{+Nd=~ijKv3Q-l*%6`pm6Kro#6Rv*l0<=VB_rQC5^EuD@wt zoRmIHFhyNd1y>y9>MGZb!S#eNNcOk4zEg^aN_e6m-&AF^09|?uvOd zQDCWio(6P=8!v&+xY2Um3ZWf)S1H!a9zjYYLmcAf4$FA4%c@R+;ob9OBB+n=?M2$^ zhD}rC`<~p_Vy*^&(>z1TZc&ad%LAShX4quR`K#NI^%h=1cRG7|ImSjq_zZpfeIoKJ z)?1Lrghs>=6;if-)+m~s5XrjbU@ZjRr-N233GUzbG*(upIFfN?I~25cIH$@xn@}Vh zC}0PhK(@}sg(A{bLd-p@3#lk|dhAuFyxV%?rtk6TM$%q{MRHo1j?hruf+d0{1)G!n ziRpX*g;f_w6hx_)zl9nM$er%Zdir9TrCsmkZ}mvrOkepqvj~^07_Ep2YUlg~)ja9h z1>u~H(M6RDk=NbxKTkJe3lUxDBqp~f7CqJ>N5d;>Zt7{B*oDXF!;|Sh>F6Mv@cfywrCQS{QZyn491wD@?X#N-<)l5sA}%T)f6;U z*7VXFRxw=^^$aO9 z|C#RS5Vw>_J{$4muMDhfyBn}LJA2%JcmpywWB3P(joeauhfI_L=X+wyugi`5g_Wc7 znUh$}b@=aFMH0(C3pl0-I%$?t+{)QulTcU3hw|MFS0va-Mf3W29t*?(gL9$9oM_$TK(Ev_m3 z)xE_0f+xv_+D4|^pjmTmezKCl7XnAiORy3KIz%_NJlJ~9_~85A;|D&d3)0;%azCbF z-Ioe?G9=n@m663G1HZ&oISbdR7K2(E@&pFttY{Jfg3n=}k2?a1m#C0ggsStxXpFJB z@n7PQy^?39)rjz={p}CB;xzV;M&dPvs2oYc4Jam=Tnu`iODI^9PeNGsI$0ej$NtF33Z*IHY!936n|)xE zb^n2=^A_s!{Os#tS(7ul`l@_6$-IbR*SgbTf}0reS&E zfz(wZYvMGv3_V-L#h22o1i9&@zyoiI>$?48>?I;b zM@grV1Tq7RV3lBNDW|uUf^EmJkDBLR<8`@D<+kr&3wv5#)Kj~iU&%A;&dx8#0484Q z-Tysac19b=^e|=onUX!oG+n-^_>Zfb+_?KeY{2JwjbGI2s(|ynI2mKiZeqG@4KDH5 z+Wc~fv77>OBrg;Wk+Kgz`o^(|NNP_HWahjpya3aVT?k(3vWS|BOfqRrpt* zNy(gSvhh__ z^^#Z^1LcY~U$Ri-#7eqNo4cAr-?Q1B_zao8_i*V+GZ2`0!g^&fa*Wa*ZUQxrdGX^;HgD$7U18)`>MJ>YyPr-|wi zqVcmZ?i&KVZ*a}ZE|Xt3f@a-%6mSqWMZ8`TrP}y%dX5~$a2+hRK3s}2`pPGx$$H*A z5Je%Dt0vQ^Bbl;uy>lgT(!XY65$xLT!)5h=;{*8RF6#1|#EPS{WdmD=oe=m#=GUEX z_uNjZ8*3_$z|nqy%<|LBlX12U00K#d-vp0!jwly3pP$ZrtfUvlW?@hev$yQO+y%@K z4`-JugdGbR3ZGWo_%iH><^!(cUCS>BH08c_Y0TLc$9~B&r?a-UxF+@A*(nvHy~`&q zkJ>sO{sT>|SV(>H3?H`lX`{pp!y_MbE||c zuO^@uznTsTMhkZ|cDom^43OUc%;rvrS))Td zAvs;i8C1!Azyg97e57a^;&H?BF8M9u9N01g93;2p`6PcRsIa++#!c?U))UvU2A!b1 z-2%Nm#*Gdn@Fxfjo#B^CMO2FNlDZedOd%hGvV$^Jfd@Z1l%$G(V(=MOGF5@CT@v(Y z?7zUPM95*OLOz~`qVe~Lp%9$Dk}TXxiyka5a&ny0gJ^H;u&mfsh%?Ozy7}p0c%558 zyQ$ea(!W}S%%xhv<*#Q3fu}7yu7xC{wl+4eq!>6G8`E`EOsz!q5wjSu8v89mQWo~x z2q1ugo0AERuYHCR9+%}qA9Z12=?5A!^utPCH(pKq+IoJ5L9PH~**LR=h?EEhxD(6B z#gareg_6-rIzg}d$}~-NtOvPxU*IMIh@~$?+UH_+{r7PAaL!U%$Rr*y?g?VMGZW|P z;cK}@{kQEV#vIwW6OC{Pq+#qnHb;2YlIhDW9_MXT zqDwOgW1$J25H3i(V7(9vNL0bX5sz?Ra-r{`5+b!n&$KkAC zLt@+6D|&>b@vlMn(Bu6@}Pf_$0TuI=4-anuq?pg09J{8#8Z z<(DFnI)j&gfGY(V%bPTh;E3DtZ`1|95>eC0VVZxkKO6eHyS!Sfgd>^#i|NcI3*7Fb zg)Iq*YE3u^-`*7KbG=3}|9cK32_p4yPbMz*Ep`>FRuS0Lpc?zDHOPJ(1PQ#XyU)+~ zuJ!RhH%AE?n1y8=87GqfWfV5EJGuL`p1t%DLvP++#@1qC&aDTJB$;>bAf_LM!gA{R z9L~Tt6>>WJl4LQP=i=1FwHB^@yNMKy=4SPHYK@OUFE+N~t}yGX_6EiTk9En;k#h5p zO3E?$_Td=zA?-GUI=dPW!E&h8Hbr}`c_-e&E{A}DNDQn54gRw}br&I`EW-IXHT5{UO z`@D&kFm*=VGAAqHDCz< zpIFVPk|9VSorx7bbi~;X#tO+Q9ky{_AfS;2zj&YNAEwIjtt2cQETv3ieKw<`HT12g zb!DEU=t}i7zhI@Rt5|W$X$jw(KgACeAoRQe#_W-_L+nAL@;K88cH6rcllHK+VLlYQ zf544?-4)EjD|Y$U)%B2dcGifscgki#@SFPEB?!Ozv}!mK&7~+IlJJSK{}w*<=RLYN+ABA*ZAJh9mz88+QcJfj0An9?>Q8tvU-uf5AB z;cr{63Ir>>H(v{@B>asjXO4DsF4o)gE|~NWkn`NK4l}ZX(oBed%-8=ASJ?f7$EnPl z8ir{6h)rrs%&y-Ui}z(iB)`>mqCOuFvPH|#?h8l|a*v&V9FT0UEKw!DzZ^WhZgnG| z5h}LHo^NYV`cPHh{xUyjY$E>)k%Un?+^=dU79aNF4j^d2tv@MXw1_Li-qLvhz|h5| z7z0zv02zN7l;eDx?wJzex?jbaq54%OoTT++azb;*?(aDpF3PwB9)9$iy5%8LJZo8> z_N)e9I%oJ|Ti*_0p;f}F+UZ|BuroXxMdeB3JfZMH*zIQwtG{US*oZ7lg7#BD!Czs< zOxXO=y|dYxL|*8P?!kV$M8_X)yvcu{Q`LZdsOSHr((d%THIw}+hqy7cDxk3%#`%hg zT+1YGiNUrgA|Zq(JO$fr>JaSZAjc!ctG$kXC*TX*{tq-fA#ihKdH%QbiTm%~K|vgK zaF7P^;@0*ig^DVLH(7uCl^_Ik=p;2l@$*kz^8vz%|*rYryFi z*GRssFd}N&=wv0we8K3T0V^uQN^2)wo7(j5mwie@l5A_NPjZ5Pj23tG0rl>ZIBiwNyo_r2fk&#E21awBu_8T8<%zW z9%glRXb2tI*l;kj+BAh%XuV+|?eX@2Tg~!(V~-tF&5gNds@nK`B;8ko?T~_5%g%r3?H~WtH?KKao?Z5 zJ%1lbBzEDQa4XQqs^0at;C#!h>mM$E`Ig~JKz>9Mx%wdE7fJN}C+Jao6Uwt#H;%4( zQur3j-S0^NH&N0T)jJ2j6}zjc;xq!fW;V>E!fl}-_L?Nm#UJ?CW?aBD)VB@~PF!M% z3euSAm5wXZ52Y2;QdiT&Y$c9yaSK=t&26>MJk!Y6kxAfK?wRO!zjZz)hjy;$y6&!w zPAh`<4mTBD2$c0I7TGy=HD~So9O}8(4#k5jKGqB}j@Tt8;83~VfaoNNi!C=R3^)Bm zUv7^9gG9+5rmf6zp|xs0##biu;IJ<~Dvh>8GTWGap-5dr(3(R@`OWnEY7n+zX&kOu zUl;dBD(Pn-n!P34S38L9afj5>u)T7Y$4f>e8^ZaI&s?=3Js{K{u;xrk$2rykQR17} z;0-HT7VFKtg1o+bSyge(#1EgercY(a&NbCJ)s>%Ce0?e$@;b|e%l&}*-k{PdzwImx z8xgF9N>HevxnOJEak2;zimpojqQ-^)D~`TIJx*06=D2@t=VgOvI1BeoobAkk@-O49 z{weJ~>%0NbN4uA4^?KR9>^B+^MPUxMw%Sbba3RO?e<1s>O#0vcR6M7o%d7)KxHA?S zM2)Y^i7uXUb#)F}Rb=C0x4!n3h`*v1U0btsCh#OKTzon%$xCXScrF#YHN zV+m1;n}z^#fGG5<@=(P5qaq9mPfhVY%I{3I{#0xHkgjr&M!?DZ35Pq7-z$&Gw6RTN zC-|RjO&o1x3Qc6ZiGv4u6 z^Y`~nLrBh_sZr;@Rh7Qw|6%u5FI77u$ze#!_6$Yf9C4}{sd2sx-xTf?Pl`$lGFTvv77R2 z!w5fGX|;!EXU_}AMu?+zyqa_In$PU8Qr_ncey0EI@r;}2NLiM*rY}FFe40CAZJtSZ zcfNo?Oul<6Co*_u8knf_V{ts^@;#ki5meEB6wtbZ<1?^+3%LCz7RmmuE0^y>#h+p+ zms7!V3b>bTH|<9kGIX;!MV1+C+V{m(+j{|v1{P)9pkP-`=FM=bF2&B%AN0T1^PaMi z)lU9RlI=lGF~td9{Tz5|!J&AWOKDrE>Pd3r%fI&ItoDv?>*4QSF2Ea!yL^cs)~BlB zZ&8p|w^sk&IipnvfOZ-hRf6iaSQuHK&*F^p9_|x=i!-YEu*iZby%78uAXrFi#IMx^Xa+ zxKYZB#n}k8PP8i?(=?oEh7m!!W;lCZ#LMx!mQiS#;h2h`k!)A7A^MhB{K z&#~3!MzZt&c;M~+T62-wiW~S?5b)!)18FITK!lOJkPze;cG#YB>(^kg|1}(P3^u(% z{PA0Loon9g-@L!RTR(>S{cm=ugzgvfqGH9pFRzc%>4VSrb0BN5Ug%u~abr9T7_!^Z zKyTHR$SR56{ZjGef2Cxe$14uy0A2To?$hehdSdSGFWdGjJZIYOil5AZ{g7?2f0O^? zk~+QUAMN~TK2+$rX+;1(`d9R}xTBEEwu_-?VO0mkM`WwH}3@?`NdT zy=KsY@IlPwCYF@$&&2S8kGAhU=>R(U;I3t><7{QV1%WDu@y1}Bw{?VAPNhpw(| z_BK=g17+wAcb^6juOMzP5>KxtFF!ypwQC$iBkObggKzSZYOcuI{N$vo6J4f9s}&ga zrtNK?%)VjFe_V0YHq+~`iGe0%`~#s^B%m<%jto8S+TiT#xX<3;-m$N*XUtzJw`uFo z8kTrn5<8UKu~)pBd2;k@Z9e8rX})hRjf?e`|0j{j<^*8?Lr!(0&S0z=gXkg&108e0 zd~!p!Q_W`P5oeNE!@hd`Gm_ZeUY)oMq;Y>@#&#jx%d<7P@;%Fs=&dUENo^#bf+h{{ zCOIbm0}*W8=$`rQ(sg2tje}3A^IKkQ$%!(FG2QvaK4ZGc`{PR?^ruA{aI7~rB~ytq2Q0j4edZH(5+llhAa4`}cd zH1JfY)O&_pqKxCOZ9~|=jm@&CyPLZDTpzgz(q61j#5TbS%S!w4gE#;W#o(dYSk@bc z!6~qzF_gy~+8mkLbIcx)6K7`KLS1@`aJ0JaL!~5oUG%LiwOIOWdI_!+R4k__#5w6k zMJZOSU({(%^d{d$KC!bbN&|ZyB|4>s*ZzToOP$rx;WyqV z&zilC&r%K`yWk1O$|b(qH^vXnqC0NGnWm@HhwVIn9WHM{%}?hXj}GA08cs$~vf2cl zL1oT#clGNBCIc0VhQ}LT<2_nR4PK+qPZs>M5A5epHMaKl{AV8K2&b?36@YIv z$2wR4Vr*74Pg+o+FrME5M0bVeER@uB(`Eh~bF~Wq) zWvVCvOZIl)bnjor?IvjLoAQUMTe6VnXNYn>YO2Sz6lL8%R>T9jbgmZX31X7%*ImzJ zf9;pfNIXremJO!V6m!=c=2Rkj*A0L-2h3CH6WyKg?#wP!-Lff%h-M9j?^43B98f_J z`A4n9hGjM@)Nq?4v7J8yNA}`PO&fi4Glyl#4U2^|Tk+*@=U8PJ&qPY*(Xyy1kiq7m}y3CNqm8H+r?F6rRs8 z#ss?L>G@T78n2y1psc_Q7>`cIcxe^|Pp#^Av>~dTqQ_$K1E;~+d66tGdC`SlI7ncn z^ejS*RoroRq``0M;S8|rlVcuWnI!7~eu({XdCS%REu1nYWLT^n;YJdbNh;|Zx%_bA zsZjvF#k)dINtWe?;dHow(`<{x40%Z;g?8*yfx-vN<9piWJ_)wPgro#qzc6c#bqPn? zEo3e0-^s(3s^~?sLk0XZ)eSC9<19-1VvqQ0foNMq>{g!H0!+w4;SjO1 zw#2P-)t|Ugv#>q~b$fo~lp&e$8Lxu&Nxpp4e+;oiRJ0bS%{jH@a#P7&il7RgLcEv* zr3LRwRZ0UWW# zvBigq8$Q^xAyOypq!O@+mak4{Go;g3*kY?Y5D)e?9K&adkkhcok}!VA*g(e^u1?T{ zS!*a?O)j3+oA2|qr&7<{RhJ>UEtkhRcY^l#&zM)(H$O=%tXR@;1uo;ptl$P*NGByXTQthI6GPD^LiH|X$;5V5;PEJ z$pGi&qL%Mvh#7)Dyg}9P7cA2lV$)y5xr$@co*34F7h)x)thMe zyO93j`aN^f)ET;C+Sh*d=F!X8n6Y;*km0@V!~MPlNkZn5<@mTk;`SVsOkMdG;PoS) zs}`H4`K#|-NBCs8iJ0$Ou*4kEmZXG3bok*Jc82TYL+_-4MJakd+Lw3)FH|4C#|45c zLmx>(<;OmdzNll<+}l4#!BWc!9rmcc5KwA6dbbeM#EJ{ug8N%SSy)10)*?0J4C-Ra zB*TDlT*o(^#v#in>B5aOXA8k8(~a$OdmqrD`l(4IZfVlSz0hl#r}%0_S`0lC_z>sv2#^$P)w&_y?z4gg&T^=RYlwX~0c~2Ur$_ z$BInFw_C2?BVxtbrVjaSKZ1yb6&}%JXQec@=i|isK&BQc@n7ZL!~X!{?BO19wj?_& z^)~#r&6mzgnLt@Kmh3ebJ+FLec`Ko;R@KYP^m(^;rw1hMM!bq-X=(%@8Hu$_aUVKy zn)!EMvpXMrb@KtFKwelX@z28g?j3JqL6J;y^TL|0SHUbOV6XFzlPo>DVG0e+ZC!og zG{4*OZ7)g-nhZXb&er90EV%OyTYa-A8X+c^3NJzqU4a$5Rimp-#XF*g&Z>zR~hy;y+)*i2@1hr>d4b#)-tQNHTCdTF!n@Gc$gK^pJa zG)d}r2^8g_(w8hU?WvH>8;M_jf@e!%=Qae1%4QgVt4dU~uuECGtXkPZY_ygZ79Nxy z3`KcXDcTv(Lh?QN^J=ig7Yo$tjjUsSH#{r0@a|~M8pJV;;qE;c$S_?pa!l+zIerTc`ES};!FZe z#)&14Z;~1!Vz+6;RbXTNXFz%_li8Dy5PM{zC!(m}-5FA2_+o}Ze0DefK}Y|h?bc*Z zV=w+-FJ9^}B?d~zPEIfDt_CV_$C&b@5|`p_?sO@B;1`&Zwzk!NVZZ}E`h`Db?y{!3 ze@uFRu;Wa3qAz<%g|vlnSLeppZ`Um5*joqZDiLFm-dbwjQ_Ep*2Ij^7SCU}3D%yq; zQ@C#SIkL;8XWY)N(*JKYf{s302Wip<&e=$w6IG~>vUc9V|2>6aemkG>YpgV|-ireOTGFIm6{akgWP(mk~ z*BVBr12T|J3zFI*_g7T1TU1l%=`++**x&>zRBliQ()@lAM5(T> z75zX*wni+3P*1NxVlf3Nt+8FFJDrB!--2|-mc|F>u~7jku3GknuWuYRm(=SnWyVao zm;UMs+foHcExlx$#QX4CE{|`a-thz^ysWT|a77)w_`k8d3KEiYS01Nw)z@5Z!O9WE z-%$*Y^$mpHVHwsX@#Q8!<>32=kC(2doK&OzqgVqh@1>{mzd2IJblTQi*b8swm-FOa zm&-F3gRv7H*)iBTl`oSwL?$f-{*J4>KW;SYu-1dhTb|LofWI@0T(~+9wzPHP_JM$q z{+-CPDhRm{k*m&tw$=l++=-{M*AFqT7d^9Oap0E_xLI5GYFWx;&J$YIZvyDO-SODD zCBKEBA9)sR+i^o}1dYy-!V$j|OjfN8#jLXzF5a$x!3k?*QKw&|;&rHsz(Rjs5 zz)y|wxx_2$jF~;l#QmGeT{>vJR5I*d11 zoKx&D6=xSLbz8;-i}0L|nruSq*(FuFMYFzcvreKneOwotdw|TAzPj3#+P>~iJAc%K zID`Of2~Y0ilc8hBl?!o*q9TDkYluf>|6>QU=OD0Y{(qTxzlKWXnZucj0>h%{jP znB}_19yCZBV5|^BSp5deqr{=%k?^bD&y^ihXVBJyB!;=-Cq@>Cd+Dp#rb4DKgl38< zhEN#!#kmdM-dLUVI*X1wreb)m;3oMMLQFWIdpx^d=OUXTnV$W77ZA^K$%j-6P;-?N zbs*>lyxqgh_@v>NHYm+(!9~yaxhHWv=K(&K>n5R`?ChjjcH@5@=(0B}vA#OCpd|#W zt;>O>52!9JM%?36&p(4NZE`z7ijQsPhR@Gw+3as7tR{P!_og``ID0tCldXRcmplQM zEj>SL5dptqaVU)ETR&ZT6WNqBaQpAl>@S?G%WZ3QF6`@9sRMR&LdeRPGsRf0i|d2g zkZIS8I~W8mUvMK%9bP65;Ys}{ji|gaHD)4cu>+wx{gEwSvd_i`%-eg3<%M;;HrGc~G~0W)03XfMfn_f0d%} zuoExt0LbTXCy~7m51-8<*M5AEVzy=ShnCPR@3uo7=loE)?6I5K3Gjpf25b#M((neD z!iTRe7$!iKC`zbejDiMH??5{O#Af-sR3?rFZkx|Im`C&M4)~mmX(fB4SX0u$fpMhd z>LMEvu_WEh`;{yEpq%se6UB@1O|-(ak06bo;&Iv+PZ-acE;@rRD*@*<#~!+a;SM%9 z38%w1b4rW9nMPLIdUK9w#}Qg}FaYb;PLvca0&<|6%i&wKA@JD0eeLYNjq9{3)#u~1 z;w?&T-O)n6#rKm!C1eh$(2LqDq_vYq{Z}jJEIYx*r0mO|;h1mxNJEQ4UZ|3(J(Qmg zAHb7k&WOguG%O)X${9@Q<;w%TU>deb-Rhhf+}S28LnJ|ikVu)OMRRK0RRyBPN!MQf zCz}Z+@PF=24xbhaULs_iv|Y9H*cIG8EbqK583g8o^P9E;pgPw)FX@Qv`K>qMX8acV`|Jw^mItG>jvlD^%7LYwTQ=s_p|zVW~jbZru9pQEO-Y{Va2 zmb|Z^ooCY>r+TfJ5OY{M?J944K=*gL9iOw`;{QhuuW2i=NIaUgL z?u>A+X)_%Q1EeZg3ku-K_1)P@DFLAEp}#~Oqu9nN+JZ_(TXySAM70V6+#sVVjXU&D zeq7PX%-s~e*aS5)Hutl|X;R;xqR&8&I_dR!znN{FePDN7 z-hj~E-C7de$I@@8A;i{}QPna}p&AlOv1KUFD$P&v6}f%OjPQ6W%}`Kl#mE~^hx@v4 zFX0hCgZQiV;62P50C@V^?#}m(y&!6vu`u#mBOrPQ4iF|m@U_J zz3AAzcUW5O0!6v*uOiAHC@@0t%@i891Dg!vvMe!6=SQ6zb^FGaR-B)4;POp?Z<|Gp zem)4;op=$cnqIo>zxVZwDOCIP78HV}CVb+4>lgq-wAcVa@-i)(3Nl9Ol`rJ4It_XR zjz@F!+dGu}=FLd5f#>5uBm}fdWcqBmUT&^-mE(cA+h!pY8kBlQMp*9V-G=Hfgdmxq zYqJ?LhB8fYpFaK|c^0HfItWx(uDsxk>1aca3VXh5WH|MVOd?!J*v|`gcL;s48Gnt* zJk*pj*e(9)Ij*W;Xga=TSV*OOi5<{D10K6wy)qO)T^6J0s^-gnC=a6TfSO5dy!g4> z<-0lugD8?qn+nZxrbi7gEM0r+o^;_tC4i)+&oy$kJ;MRf))D^pQz$1RTf`gtB6bA- z#khJF593*7ZA@h#lw z23m{?G`ys(m3TN_;d0iRhZ7lYb z+pw8?-Hzd~B}7)}c~*HIWK#3&9FHNNT6-q>Z=CxQ<0-3ORsKZdo-5`d(6Y!?M5Dc8 z`yoBA%@;iKk;S%GmP_@NAGT= zr!PY&`>$x!#bwGrkV1=GcFT+E+o)8+dco0IMX{vx*#;-oW>L|)l49OzJ%gXUTrZX_ zi(W4g1bvDg?ek6cE{ObqPk@ZiI1n{1IOiq$rITGos;T&eo!w{dUM@$%VdV(rB)8<1 z?tb}-R^~>uo@6x2VLR=yW^v0ZnC%YYzU$W5c5bLUzeGaO;TNSLr)ntfh0rYa<^Q zr)`1C1dpd8Of;jBi;@m^jpx z^fo57Y9o+cow}YhUsk&sunvw3A`11@iyy6H`la=(UM$&tv*K|Yen;{IiGL{;Fd9uh z)6*MXco18VnVpi7nRS$b5Pz4#8?iTAEWF5QWoK8sS3wr?WTU=fn(IL6!GvdZt5naP z^9gvwlgiY9lW)cFxdi19Mj!8deZqb@Yw%m3{bsz@M)AiU0sS2X)}Q-%{i7SFc#1aC zlvSFqkVFMafwhbj@v*obPk!=N8Mpw$GZJTZi)}raZd&| zAGLNUuVpNfy(PxNZP@MhnSTse*|`Iyi@)uT|82C-8Q0iYV69nF$Qg0mD-(145gS&G zZ~rr!MKha?gF7E2?{Uv{RN`I`o23T7DUUurw9KUBvW~4kfhb0dvLs$9>HSN zTTqf4h>d#K0P_+L^TIJz>ZATGYUPJj+pB4Gna%A`8ovNYHr~A(gkcY6*Gz#5HYj8% zzrRB?Uw3%6w;iwiUy8MQKSQtuPc;ruu7LILtW5(oJRKb#E06Ze#7^&F5JOni?cIv+ zoRRQ#J8-(re^tqVIO`?8UodY&>wUZ;H22H`1~IKb%e7sa&tXH>T#qd)G}>IR+e_vE zjFCI{40DHJSZ$uzukhVB_JH1a%I-&Aw-@{VoBAK=l6|(ZHWYhtW4w~CxnqB{$01@ienvxM4!0fL)%HToY0~xio z{?Q*@{xD=*+TG@ZnRG*f7WYr)=hR?C!>FI*;f?KjzuNk1Y9N8-(ux-7-hAc9@j>KZFBAv7o0Vp#GgV_p|U90ZRT6zrA)9J<0$4a%zii@MiwKFWm5) zZg*+P+2xSaX?@Jggu%*ERLAny+PJ6ES4c=&jSU zOOM8}w59N;Z2}Fui!BcmNv7f8H^M{WP3o~-8*rk=D&f`q{N7_EZr+lX1piofBI$1x zW@SEdF91|!qo**|5E0n-(16);RNNVh=QY0}EV^z}3D=YbN5QA#vB> zA*Su%J~6Uvc&6JlxopW#wLvfd-RWpQlHnm?AL&|qQLW4|Fsh`)1_Ls8W5dqr9UK_1 zD@NL)v!zxcxYw}(l}L;eRgK$lY}T*CpH{|(b2AnIv|0L&X8yg<*qk=UJE$DhKhb%F z#p)3a&>2DWTZ|)Q#PSb0afdzn14@5h+_;8UK-HA{S4qyI__w*FACzAmw6{)Hpo>e+ z{s(OxNrU2kZC1(;i1;sKzwsY4Na4q=_!UBU0aIQ7IX=eB=RksFdv1vKa!J$@#~7_i zS)B;375N7;lS?7HxTxG=2TX7!SF1w{pJ{p-$!_hCNL!{N#My|2hrqKR0DgVg&gwsl z(mipgEI8zeY};=4mGjk6?~NVNaa3H?ue?jAROQpsw78C)_&sS=A8_8QG4m#k-Kg%t z$0y2n5rLh~z+ysUngkwGLRF#%_CHjppo3A#?Lu<;P6P%~M8h>#nd8Vzc<)iGv1#;C z|VfU5pJ#8Z2y{I#9cby*Azc%KOD7L%vqt6Z6WXKHncuw}CkWdl4(Er!zCZ zEnWf?rRlbY6aZY0qLZ6+Kkw46u360=en?eK@L{yuITKpfu2@ulE@gqG?CJgBCl~(_ zHp!xD7V08EP*v}bmkuwxp1!>UIAe3^L+!B059rL34$I;rwZ0+-3v5@*7ETeF7SdDOkYFX0tnOz zaP7x6`XXGtI(zkWRsDzFlt{^hWm?oXDRrQ|>FOf4+md%iYB7_X-C+D1_3QW|rX=K_ zP`qipJDel#HJ(2j<_Rj4`97a*&ez9*lmt%&hd|yZjauB8r@~X)``!7*52r@Y8FJ+) z*n!i-pr7io^yr@c11ZfL-rhsQLJxC?zGXj%Bm){q{#rQ>rx#mN0GglZToa}-LiS7t&<1tEDhbpGD{N-Y zhpZgC+h^#TOURor4Dj36EQ54;4)Y24hEMJvl)~tv1H``{PRY)MG38XGDr_dGb4t7% z)`A1x^4-{YgVIN^W$a$H*UnEcSuSLSw~4U517tX^CAtH7_V-*_iX-OZNd?+eFW6qF z>H$}g!4UT{r@7(ukXBHSYk+uj&X>SWAl=f@fP)~|1L3GaB}})GzNDIH0eel@AqcN{ zyVcwf2|?7BipIK6>O3$6Ub?n8Y~wcK6AAJ$4&U4MMC(7dhKh-$B$s2GOYM4Hh#L_# ztWW<*O7NP}Q*6%JNs7SXXZMNjuTDyU<8p$0u66G014h%Jv@?J@Z1V+pD~L1q6h2$3 zWi?JVr~FC0l#{ER#sX*ZVCW_kWK4tsjqlMO+vESk-djdR`GtL>gMc&$0s;bqgn)pG z0s;ahmN)>oK;hJC)CF*}p?Y|#kSce?t(27FwS(%lVJzI$3Xo)#;7+NW1nRA}!4 zk@Zjmah&{Q21}cV#T}#%uL+&tJ+imMxZ#twY*L9?nx-99X_6)PFDyCQ;N^-z5X!$N z>%vXuJWJb~DJjl^*=8Y3ruYh#sU$LYrogo}K2yjcKl#OFVuH?~o^mlbi!C?m(Lkbf zBuFhE<1apT1@!N?i%gx5<+XCmNsY(v$^8D_CK^*=p3-5hp)_Rb?;cC%I+7k2WQotW z1jks--Mo;Q{|6F-cQ$`m=Fn>lunuMQpe6Z_aX*pm%)i!eQ?EG93sQ%go*0EBq`hx1 zD=VOuAD1oMMl){#|<^BGI} zPh!ESB4VDd!=23>H3>PI!tWMe**{njvNSV1##*dF2?(K}<-$$P?|&moze0ga(6hlD z&i6KMIDK9!CebYB-_R+H?E2J_~S$va4~%nH9ak&{VG;m?m{*V&~+66@h$@s@4XS zV$AktyqeCrrT0J-0u!0SI1}X#_woy#>mNRTRG@3oGZ!D%q@bVzJ^WS?^HTQnKRwRa zO)bJvlZ;DDVwqi*F5q696R5Q##_npQy*`&aaCR3E=P<8!dUZ;Y0ucfRy5o~%ZycMW z_wbT7dU?7kREjJ3F@DmQt2jS+uU>12QD_Jdkl9&=GH7GOBwszY^k6#n7WxPJHJ~)H zW)#P6>76O9LRt0qEp&LY(eZA>O-tM1x{A(%% z>F^!Ss{h%qhS@}AJh%s_NPPQiI2{{9%3gU;WRK#qE z+bNO%c`C}y1osI3P2&#eCnn=IQuvxc<)&!OBQKe{KkixFbc8I4vV>Y5x|ieSL>H$_ zZsRLw^A$Q_nh0p^RGooQs0kKk0fjIfCj)MF7>I_PQ}i<)L>vUvTwjI^#GR|+g8KWX z8P!MT{WQ^>rX;l`Cxe(V0Rd?c*bKZAXIYwel;-9@Pv<{=w=ZUY=X`Z5G@|9UqlVP1 zs~HhT)Wv*xQ{C8ZN3pX|GFT-ZCil+ZnCmm;hNx&WSmFA7o4O#km!KMsIitcUcR7-G zO=p=}69>MoSIx$eZH+PRy@IUc{54n}@>E)OK0O^mx=hQgmaBRhk_@>I8np54J>sd| zHB+OqHZ{^op~W1UeuKU~Jzq$?A1&0J#8ydQMZd{~e+ln->pqLhCoUm?2i_5X^x3aY zSM=A^Qd1v4D2}q$Hlu0=OJBC68mxj(H%=}@0?vPacNv-2SYOS*Fk}6qI53z4@BTQioreEU8YWg z=$v?H2|kF#=FGOGRf58XG#Gqf%3lP%`Sq-3n}PdQAS39RQ6|);gN?rlDIID$s>wAgH*x^4}`ZD@8$e&e0~2H?`(UYf5@VX7OD7hh5BVkOP-L&^mozQy0_y9Y9f%17xr-X5Hs7EHMOPux^hk$e{m zFKry;7!&CHi{00mcR4;yj*Z|_zWUOXplh;Vig6HwG+UV227V+a8oV@LPop|nQiX`W z0u*vU{%8J2((K~PA*WH6C@V5sZ5&;zM+^H0C%1Qni+8H?oi!bqPJ-p}y~-j`C&)H} zjQe;3OJ8j~r1(l!Kv06KvL(3nxyd1?7y>E5ogb_I&MyMd@ z%zVLtG9T5Inde7*OfVOn_kpbBCh3Kc?LmpNq(Z@`8Z$UHT!*_ihXDo}9HfilQxgLGM`X1wSKi+qU3Ck6-N>tl zaaDAHu1XWVvxRuvQ0mMFiK3IH`j7!>^iJls~-v*XB8*8eaXGa#8{kh-|zN^i%A`>D%iZX?Mvjh5}HAeuW!LvF_ zOgV>q^G9jPqlw}dKB|=dnxg;-3PUZN@IEMinyT*jemQI8q4d0wuv!Nj@zJ;EqT?}g z^YmxY=%*d6{@FBQoP4~k0_Y5NI;za%#cb5sZDm=^$+DR$!#|LN9n?AzPT#0;ALK7@ zgqi7e1)nZRsv`=MO%$}%^JbN$0JBMmL_7ggc% zUe-o<8qa(BWWQ!#yY0o9FFBlkAlk5KZK!V1?`5tQWDX9zdk-S9B@`M-Sj81)3BUWj zFK5=+61x|_jo+1c7t}j*HmKrXyDF?TiG0Sp)IPQN<71f*(phS6%n5bd#NFzQEv;wR zt8~9480}qDRc6VqqD0ve9mSc*)Qqoi>WM`Cws3CL8x`78pomp?Qu=C4^l@|^=RlCO z9A*(~Q}7a2+S6AoqGeAoSOY1xRT8%STBfeiQ#+ zGpEZ=hLhE}xf94%tDs@?h!nAkkCx-wmWIxI?cA9V z`->cGU%5CWRCVDyV_$Ahz9jKX-|o!cq3Et~@&go3X`OBTpl3!gD=27+1;y*5MS~c+ zCYNe$W|v`+H!OD=a%vIdYUQP`*zBh9N2~>{qMpZ_e$UQW8*>{N*%^w4mYp5h)c{_r zaX-C^JZ^Ceog8y&?(c0Jlzz0{BXx+r)!)B9?A^LX7H~T&&@21BeA!Y-a~k$i&<^2! zkio+(!6GSpN+U^>AFfBS%)eL~orFWunBVy9PCH4z*TaL>b!^#!ukm4Z#R01E zrHR)~$#J_o4(p7mH^UXtg_B6`!^-;bAnol%T9uK07lsD{B|xKc(@0BF)E;6ia2zWS z5CDHyr_{%mJCAogJ2(cR=OS8lBL8bEuZ}})D$8l^I}sgXm|0x?!?QS@nsMaE?G{!- ztBa^du!@PIFiM;($h!Y2Jvr6MY?YxH7Fa7Cqi}PTbRypb;alBJK~<&C8gIy%Pv8$> z_V=)5V0NO!!r+9jpB;Bq*H;WOA?cY z%}3Z3X0BW}2Z?C#)`fi-1g3uyMdKvL%vSS=gzGbQ7mf}IimFeLd9bhe~lRNii*nXPI_H zggz)^rhH0*SInd#zqHg`R*am4mD2%aCDCOucyrg+s4At#HNtjXLMNCy)7kqJJo?bi z(NE;LzCt}#sRL%AB~_gzM@Ie_=6TY~qAeG71EZNPjD%NvHX}$rSGD>LI`9#c**{OX zV91*Z58AupQiQ#xQ>GtsMXq0`ZgBO4k^Y*3-AMCjLs)=26-k;t`cC;z?yCQ@wkrXj zZzdV1orwaO8(S3^N1xvQ3D#`rx!MZ^9IOk5yR+f1tiRM3pI_}^jI@=k zr8Z_+FYiMYG{JAb8ICq_ZLL-&V`8l&;QO^vJ(8iBZYCEunEV!3bK@nk|FL(6cr?Vh zB!)MuZ2d<~TxE@CbZ!IZ`d(R;k1R_9*E{V3tWfFcM9Sm?gfChBU!yytX1#oN{E|n> zSg(~-Dtz!98mc#deRhGjKmD>fRdw8C@WpifO#z5mBS)p(N5bjunTbPe*}cJaxm&wg z^zSLtdtu_WxK=tfg(i0HWO%ugZMEJiixsHcL6cW?PHkw9nJ}E1;&+cd`DZ6lmBsr`jt+#6|vO*9KY9NhBnef%ky+$$TfEBPr5tuz%v)uGrN_ zDu!jFMU`v6j9k{I)#AG_(qbA+2ye7oPyv+%Hzd{x_Vwc@ zdc!|xSv(hCZqp{z&o5J@`CKybSI`>a-|5mAsGQuc1tNPdwwJ}BXt|J!LqF2Rr@$TB z?_s$T(C8*QEAW$V^{6zqT}D-MgiyNnT{F18AaNpLpr)T}{8&q4qMFP|IVC|!l_-D{ zI$*0G;QzG0QD0h5eU6t@+?`7nX?t`eHXZTl!D!@Ek&|Daow2A0#&|0ywo9RbZ#Pdi z8eQye6)YdQ!^~Mqe!27E7jul~n*O#0-?!~VMZ%|wV3Wpz1_PeA;+LWu`TCuSzy`C) z&Ahs>lvwyNVS6D∨GZu9hr!2E#qy`fn`HGI@{mnnY&g@>^h)3E4e=Ao?PLFevkF zeg3nC-!woe7{bUgDUr#y*NEU~%FE`JhKO*$)wA6d?zIW$6_{tG1tYI`E~U%!qDo5J zY8_je!QpX+9wte_0Uqq6iz!U2Ff+b7Hf8AOK1776xX2|aAwq3MWyKi0FU-WZDYrjO zrkht1uBfc`(ya8yd0X;L|71YtuQBmU>LxDQXm7^#@k9AZ`baCoI3XW05ush*Y+3iAC5Y{kY5{x-GL zuQiJ*c)VNen(|jD&#cx(Hpn9;c9ijX5R$=vu8RLo0Z zv79WEii)#QLsctX;1#i1k8wUT8sT*UpEa3F(*8v3PxdG>+dChR>cZC@Fc#?)&GHG- zmmg&d1#%K)DyegwHC<((MK=gTw=>H~3rDWOB8S)5eRiW=<`I!_@a^ZVxSzr^1)KBj z0PE?0lg-)z$;f~BqZj%*Km>LH-MTP(x2i0-Ei>zngY4SP`tpF>m?*vNjW0sFLU&D6 zJWtl#r8@stmFIEcd$I<6(iBDaNm|RzprOhFDw6(eu4M;}gx$ycp7^_n+|S9LR0W(E zc>^}0!k_PrOBQ4h$PFzKnMx7VoX@}6|A8$3$AI+ze3Sn}$XfXS{=y7;c}350Ati(~ zvgp00yoVgqWAdBi%^(&n&A<=QxEI5SBvDW`=&Qi9#4jK zGm7oXZ!QkR+3nZw786+!$@~YWhTud9> zwpEfcGLU(YU@9Pz7XLK26non9$~&meCD_jorCUp%eRWaaR&=KG#&Na1_E(yl*|yPY z&9vO!Cf-gi?>VU?9&Ub;-qKq3in00nmn`(Xn>$2FHBtIqbx_HnuNxeeHdtwfwl^Y`gxQUJ+Af~k{>GQett{2d9%FjSP zqb%SA;Us3A$)^`*hz6X`fAcH>5QKdoq2-Scf0xl$e9ZZFxq*Z*m|9qQ%B#69T49+Y zxQ}Cz5hry(pdnPMQOF-ZR{9~ns4<$Xs6Zn@tYl&Z@X^U(t-2dSmVKVFP@~>S)Z1qO zX;JsQE@Yt(>Y1!U?PY2nd+$4k`03ee^bm9bL)YA!l;)J(XWw6PHX<>+zo z={8oz5op(jq8lj$P&s0nDHY1vIZ3`?Qe;1dja}|&Opj7XorHcUl&k+jA?h*R(pFo4 z`+g;kWUr%B70;RVEa7X|E&LDW%)}KfKRv85s=kCVZrxDoF@X!T~Vp{oqj^14wOPl%SA8sKA@)FBB=BTjDvZHP&}s0%vC_*@Jp zNl|$^`J5^t41<2!NVD|#g&c+iy(Z91Lt+U0{lBg#$rTS)NfSwN&e65m_oCue?zm@5 z{XE?7W)#o0=U?RuMaVrKN5SN_R}GFXRD{@?6G*P0We0Q2S>z+bgTTxi$QA(dnUwM} z%h(d8h6^IKCMy*HzlRp5II&%{OihWG0acJKtD55O&Cid`<(}tbvYYHj2VFh~2h&B= zvwDa>;T~_xf0rR6k9Fjl7u>8s%kzkk!J5`A#}&tzPySMXwgu5SJoS}Q=Nii@lo9sd z90bVbO^^Ra&nki&?x1~g4m)Z#puKWX0 z`n-)WYlyBNs&JE#02sw-PaI1LrMTs-URCEX{GENTi$UP?z5nN>lStuR^_|4a6Bl1L zTV**opx*CYC@8Td$3vJ0l8C{-Aa0-?uN-s_xf3l*86W2)5252IVxDa#jpbMh1~hcu z-bZJluiuYN*bpXv&14cWgmh=s;H<=u6s)MFt49ZWCV;vIIn5sAwxw^S zewRou7nQ2S<>HCURUC+O+u3xzs&HxcOTI$PNQR0rodOI=d}v7&pdUTHH)F5*1Qrp1 z92aR1$AxN4srM9s!f|J@w>WXIh#dhq#N7XS)CG3zTzODZHl%WW!j`9+I1u<*ZFc^v zY+Til)hkhi!6DT~%*HZ{BPX?Yh;fCQa)OpGj{V$1M$1Fj*-XT3)1inVYaSK5zzx*-NHGF!E-3GqqOc-dU_&0sM>KtKcn$=0-X zuTXV%k?%ZqYx*oM43#OI8-E&xiO8nJLd$(<2clrDD*GNJVRczmJ#8GbK=i~$)@$c( zbkKi_wx5I^r|`>Tabia&6{MUHy?_wH8{zvYao^|8C%vq{8&J3HVw%e^!-{V23*u~* zn8H?0)uF?4G`iC*d#WOq9xIv}l1_k)%5Aglvy(2?7&MN^yiCn`?W7D~rLvRn>ZDET zrvpNLKgL4lVThN{Q3FO&A81km9exR@k;r*GVqvMilf~If(3Yk`CPhV-WuL13Ybg>)DDElgA)btFl{fVHO4j@Au=;Nv@xF@ zyhZke^Umu#q=5!S0x}sa;I+%XHPn{jG!BMVLtpKS%Mz2xxy>{M9A=CSx@7zGBL%GIHD{|Gj^kZGsQMJ&yNXgPolDH&1OwKt3tRHiu!NHf{Lq z+dcXEeJzRgA6Fd?#|$C5idXLlY~X(Jr$D0ALCZwBLeuEr&{5GSHPghwRgq|_ozF7d zulZF*#`pNI!@`#3r;7Fg3O@NV48d)Pj-S31dbr!&fFb%Yn>!?>uqjyn^6IZumfX=`b?281M#ur6J_u}D(F1z62zRZ<@;|0M+l`)>lzCp_ZF}tB`(|BUO&VYrb^u2k zanv!Bz5vlvY;yMo76cgk`L&R72MP<^)I2t5_(l7xmF~l%bEEltl=Q&-ot%$+&N&YF z7!`7LDCdBwY5T(O1Ss1PcQ@7DJrsHPc(Qv$tS@e=Kb>yr1MtX$DC0cX#0*XgBP(k9 z3KasZ#7Kj3M7tc|Xh7%pnx35Ku-4W?Ej!iPQMt@Co3xwnnKR%ZTT}HF@#POtUm0$0 zj=#;m1G((l#_yr&!7#PbC+~8@1%nO5_Cmd`@T8)|ziz0CcI2RhPk9Mw)jKD`L^iJ7 zqqjU%AM+L+DD&Yl*p9gzXki9?1K`oF@>pn*dR5tbs2Vls?Y5{7-zQCFsdJ zO&K10$PcK=06l5W-@yddxT*C%S%T(jBeUUyp}yswEm4R9Qc;c}(;q-abRJ9$7(*Xr zc5jm|4@(>grCd&QkBjySYlWTWmf_(-QV9SJzo*ii^ zJZED4S~?_?P!Sty7mX7Nmct&RMLC{feWl{d(b_VBO-w}S<7y3L;OwZR2z81i-@I)I zbSQ)rT?l8Kx*s#8Vm)6aDMAb`Q?KeUhrWf2PI@))8#z|WmCPHpOAMh{g+amw+~XEg)5;40!+Q}StcfH6{bFco)_`Y00@+*o*GmVd+~ zONlA>BH}L@PSfD`?sv5JIw;s5cY!4m=h4F76PiBks`ie8m1626sUKK^8gqs^5kGu2 zMnWrk=&=B_1rDgC&$_hVPpOyQjQ51oE4@fvo-K=<7k3~ye)*t(k8^!)9>K0ZIfKgZ zE9t$vp>oB*9BDVJlp>$Qlug8shhXY4C3EIPdEmeK%M2cDRSqdWzP1fTC;UM@=1l+TV$zYmb8gAU3)AUeU`Ta%p?{31#~ zq=fPgTEPGiKEEZ2KwZR4I7ACCi7c$PdjWh?8pAcd>5U~j-n^ynczeISkzRO4CMr~A zJTB&Ln%1~wIoilCr6q1Zl7+_>+y4UB%K4d0xW`WCC&|QdOtL~*&3UcUirO$%he}9 zVBgx)?pibEr+c)?R?_LU;`=geEsfZ$JdC&pHDaaA<)`etu)@T>&=T6 z)a91a{8H1e)tJt|6wXelLfb?Cz~aAljy{7s&3YBSsr#tVgcdEbxy_mwaXP);YUt<+ zk8xET0^L=(`~ffW!#VrCx{(>R?60-{QDyfx^0>XAt-(W?;C)^8N>f1Lk?>MX z;hHe?$3VpIex;1{xhu$$l?%nYvfS@C*>`uh?S^NKQ{s^ocwf13Vin$YgH5l5eb~q( zU*^-?h~2w``8&4+AtJ|o4SnYoi9c7#HL19IlLs8uem9>to-5Z>mXyf5W*C69IdtTlSZNvlJv%7+G)o}7C@DRYaaYo@-x79qW-?fY)6XW#d#_oU&0KV z_?0G(j&2+`Dngz7y=#@dt*CvPN7)g-#XBXFl!l0>C$1^qKr^B*sPl+R7)t4j z8KA!)us`4vq}sG`D>?*`;Ee_jX_CYLDBzg)yH*W(zv}bK3hZIobs^twaZt_{apHE) z+zaCd4|J4HkMgb#vwq>+x>;c!6ZI1OfR;)x z`h73pZkLaI&gx6R5ybyGc21S0n`cdU9V!~zdhEeWPFRa$=1s8 z)D(mH$8%Q?V()(-%!~es3Lu_JxlC-KPB&Az=*U%D_r||Gp-=w& zh(org3k!Ss>_#N;3$SKK7XzZLMnIC52hD2UOIN*acGale#XMCIRH1Pd+RD2RAjZ!V)CDLzmh z6$9)5dY=4my+W`)He*)V=wQD=Re(*fu&9&aq|epB=Wv{iX|i>F>~i;* zp4Se^#~`?)-GtNEKU%H-LSqyZnNyC;R6iS^(~Ag}+nZkcVqbb>VV#(6Tt0@--hAv? z-yY^T-g=()^hIT=D0F%f{Kws`$xw+RH{6^FrTwVG6b1ogtOlfhE=TDNHiOD#%e>sd zNc*a{RL5|6MbesPAxVlao-tjcjI$EFn$fxUI3c%pYRn|e$ned;su-sF07V!0r2Ctt z!D&ZdzLjE1-6wwvZOa(`j9PbOwF^zU8+R1}eoDplgw0l#>;nZO(m&vhcN%cZD z1-e&#<(yB-9*O)Uv2q$y!Ua1*dZ%`S_v8aL{gZ+1R3)L!#jZp+?+Er2`MX8aB>ix0MhnBFfIFqrkigSzZwdI))5g#iV7q zcjY;l{8d;l1FNs*#W2VAGqKyh$CU)-`{gP~-gFm8RY=QNP`&ZglW&n@_%Pe3E>(3F zFoRXA@G4B?g%Al$T7lWoA&a2w#kD#vs+~e9XR*m|T|Ky#g1;o$axXadC$`8773PFt z%H)p7!DrT+&4|kjgR>v{Tw^-?ruB6CYq=Tkif;wLf^qS`DN_a5UX=UTgyTJ~;-vXH zdsUd)hQQO?dAZIvQ|#|Nh|wybD_Mzi1p5thh6}#z2%^`Z|7Cg8PqK7w=k(VN)iu0uzZGp*3xu0YB7dDw*=?GKR4x5f4X)%STsq!o(bC5Iv1GxWO@H?taP zSv8amYugonjb-4k1;xs3uP-+gGx$KivYn2L@2>3s%GU?<qx{e z65AV`Cf6>jqq%ye|8kClS2bp(6q>nn`W)#biMC*xb+uj85JPK5=ixi%pHWPN0k7;H znm$}lsO|TD%o`}er|Rk5e@}|^4l&$yDUxPd776$Nf5Ql<`x_x>JMvx$LVJ6Hl6}^A za54zceoam;X1C@9x4j|pC+O>&CO{Lrc(UdKSpaYf%vcWl# z!&d>@NRSL$jCT%J3K`j$bPiS%fWp zQW9Z&glZl%`8NmjVs}Pp2#_KcbF_h?G~oCLD$hcIQF6Nz2usfiBufao{x-66-q->N z0z+Lq9HgOxPc}|l9{`U&*t3~V1ZRWJKaid<67g*qb~AJayHmhH*`I9u-#7f$S z);Rolx)yfnTh_3;bPCulp4JXm5=y_MuU{h2ORJi3FAAi6?!6heRhS-J&C18Ar7Jd? zHRF2l?wr8NY8YuM_MLWFtdRFs_&e*LDoT++vRA7UV;qC&Z=eT4oj1?4u7g(=&w$)C ziYCX3`nx2nmt>kd4NmL*XRAgmuY7DvwhQ{FHN-Ew>B93$b#C8Nn#&Cv(Ch4xICy?f zOXK7CDC41eLC)QG{cbjdNxD=&v?0N+Or0F$V>iIH^V7@TfMa}M-&=F`#LFN5v+S%a z1y5BK_;s8#W`S8WzUr*nfDoXr`4M+!BW0Z&L&lsQgOUO7T+rVC_DH=#oV$J2O%+nf z*}5a9vnm`M_SEL{yp(dP4r~Km_p213J>S`8=x3{)TF$h2O zn-?zS-n%{$d!zrv1Gu)Aq4bV>JIFmWf23AA%qcM>QI~dwwi!#3PCsesU7|DhnzO?B z=Is6BKK1}>*>Spuy@at)lxGxLjT9W3u=?T>km`SBS&}%Up?GBI0?$DIt`v;0(CDR+ zt~M&Hjm+w;E>{R>mHhW^S-c)S4Qfvg%qWbMHYfGTd4EU`-NtN{c zVX2aK{mo{8q)&W9#6qRsTDljD!jDu>lT|NQGtxiBL2KROp}O(Mc}c>?Eni)vl;7>4yX zc|9$q?-UM3`aSoEI0${ug5hA3vfO(*k?%JMH zYA|K89cjy=48`~;C4!P|a0bOsi{$wBIrG@6$+W2om?h~{ogJx6OBUU1Q=lbKCKE*? zoJPLsNpazNbM=fu?&Z{r+`nek`z_IB6AWOh>$R22TAt&4%ivzjJGdX}m7ouYZ5)i4 zOa^}ju#gJye^dSOsr!8LrFqdp{_2oB2g6XXuSaEDF`R^l+%R9>7YezoY6uuY8585;#Yg)3C6wbP?&`DhG0?p7m z^Yk00lCOcxubrN2W&!+5{ee~ALI2^P=JdzeB{x{$SAO9TM;|&zJIZASQLcQSKerFp z*N10*rhrc5`#X&s3(ntLQ6vSTsLmG(c;Xd9G71#`3QbUP^tUp_z1~$MOjZDGcA{pr* z0R}Q16-r0~&ky946lY#;>m{{tSFFAJdp%v@@aO z+OuH2u?{j4g~VjZG{3h&He9?fcjD^`nGNbiHHwb@19{#pF6DigV8ZB@`0y7S0+U+s z1fWGb7P7&RfxQ|mU7Sz-uL49(n8y*MVHZwf_pFW(&u}9me-~PdNdSTaHj&uJPLDQu zf{)a+iTcfW@Bk*0(cHD>&h!tqdz6y>lWIFtdC=9YTseGVIn$CH1(IymE9cvLM#qkB z*OZ*cp0>D<7eJ!9)6OcfO-r!^77)`zco3f{9}=G?%ICJn>UmCb{i8BBgKrM$u9gIH z9TXq(NaDKL-ifzZA#oJo8$=2h;N3FK@A&{5G< zU)tb=gfV0ia5D=e{g%&ue5gRCmcAi7GXb0n9`{aYcue1?4ox`X0qu|PAmI5NH`H#t zY%B}njHJWW^as~ncIW%hcsi1l-JuK~Ztc-Q^LUl{o*{(XeRg?7vW( zv_1GiZcJom;;eS|CG!Er^$y%(bTp@^{E}erOaJ7`Jf4yv8}lJeiY05{hO*=Nhjpju z6JxG>xo2n)sttgXrSy3f7th(GoklOSqwQH?Gg# za1NvS=Y;>uAtMoQU6gB>%LqaGL({H>Dbm$KB~NfP%O#Fpf1Ub9nJM14NUs^^h!P(D zE%upxucxE=@FShLCjUa&cHvuDaBY|n%4cLsk`Y_XN|2{!S=!Vf?JK3ZzMRt8XRg0@ zxi49o4i2LI;ui%wA`jW>O;(Hr!0({1^VRcs5Tswr<-b3!5bb8Ud7X<(mYcM&tLx(I z{1JmbFKF*B{z?bzEdN4c+g3xP@1c7O9+cp1kwZY%Qj#})N`O`KcS;W!jeXL^-Dv{P zXrYo#XgIW_K({>q`3bU$6POlAQO%;Y0IU@0y-?u9xI5@Q9BX`zp}tqCD9T%@myY6e zzPS_Kh-u|1f&*PMY`aV?5W3x>IU7i=nELJ$+r6@=i)p0pTU7x9`@jujnYu$esyDs* zXei_lD$`E2CA=y+>wmn0>GOtKcGTQ3`5*C8D$qT%htL;D9b~D@Y?M;OKQ018Zfzp2 zk7#>UZ!CI8QMyObITlxSt2oc_spRZI4Tdf4``9KlvTAkJ@+BgDk`R3{&Wsfo`H#MUXO5RUW!yD8k#$rsru$pypCRC&H!|yWq^Y!)p2E+6n30H zFr_U!Fub`H8bq)V^Xvy-3jc`w#bmXW7O?2k#tKnc*^D~-cVrF6?=%`+8dmuc# zQ|Lc9wO=Pkg|O6i)?R9M>V&BGU6b_-Em>b8(NM}-x6_)##z-Z+9dzCv{HCrrXDbOZ zH+Wqn-y%B+r|9w`=6U=0ZHt0lhBSQxD465`6;T7Hjb%2oJ;*?X0CK)|RmM!w==#sz zKKq@&+h4IwhU!QOI>1WQrg}kF^${!{@m0?tTW44iP2mm)5vO1qL>t23NzX6v9?k;% zraqfkoSTf&M%3bk!XoK-ph8*kfyzw$V9m#1j90iI{Dm{%Sd~tEB+Bz2WUZ4X{k(E8 zmcHw)dVa`A@v|)|-6RmDIlqv<@Ic#`$2(wsfF(=T$!Qp3BgsB_W?tDMz{!l2SFGCw zIUys?)M*dCoM?5O${)cauR?T8H0E(k=`M%l=IK4>Im-!((PPd7O}E-R`T$E+d4kW=B3q|hXpRDVG$A`oT-!1vQxS(uC1 z>Qs)8?<5Zpbg!M^V(~J#*)Tc#d1{vhd3l((l1$RdL5G9K6|kRL=>-l?K<<1Hc81M6 zx$VdP6}D*U%#Z}kPpl@wA#686cOD6?R*h3<^V)SIlG&)bi8J2A5nlj-sNn0|Qs`uK z{T_F82#fJPhVQIAXR`X>a-Jb*t7m(1A8<2b-O#bB|98~ZXS}|VZ%;G%j#lR9w-czc zyZ@|!IThb)^ZlbI{ziTOKuXk1jBF{)K7N^N5`NnzzhB+s-)0;SIulFEwk(po>kC4H zcz{@YA4NZ4z84Biw6efkP__FHeWwElrEsPBOqZZ_;i?7q@6kU4?A@IfH=kEAr5y_u z@XV(0$DUPlloHXgJQ6bLXD?<<`kpt8N#`Q6asRcZa}|D_3XfZZmNn*Xa|i@h2IUXZ zD8DaxnQadLvo>VcFG1g^EZ4;MQFwn{t|KV#3uRpeE~hG@sAwCLZqd;i{U2(0@e}f{ zgWjPt0>QG_p(PfdUp16U zrlYAjLL)P{!j(I+tnmduk%^1lc*>ZE*6nU*v;=S8i-x4vWM$fZD<1fc&3{;Tbetdb z|1LFqT2CzdH@BSJpZ=IH`_!Fu8XMK>_8e+|Mtg2=Zc}PM@G88Bx53j2o1J%-8dGx0 zzn{9W#Ntisx}&z&!jn})_SZ4;I#`cni;;4hZU=E~FWuEkKl^k#0|ghL{QW#7N%{w( z^)=bU`CW0+YWwlJ12O96WD@Ty(&{>|eJ(_Kx7HL@>nqWOJaE<2($P6^Yi_Iiqx{+V zqmZT+nTWK89_xx4nTZ>r=RK)`9>X8fKnukuZ?$AngrU~&j1<(jvcx?|YZvCFALeG&THDleFQoUhT}a4- zRm0qUGtBiE8k&q55={~Tg0mF%V(|I=Qj?-C$<0Vh=T7OGKb~-~kI+$s`=+gz_R^|> zdBcWH(;qzt3get&{|4jW++h2v{i#`S02RY+?kn6AUBxgW<<}jJ&-F;dYr#4i5;_E~ z=B4@HkB*r>U?!)&6E54C7Rfa^f&vBP(qQ8Va0biPX@9EyyNrQEGT|*m!sQh`$!7du zbp$hC=J|3_EVO&d>MwjdlMKbA$|+z9sfa*5cRTke85d+ZS(fSuio}UoL^$=ibTgqM zIyHf`x|{_oqOc%lj2p13QgGrR&b4zu@wkfdNtASbT`@|hx{;tKta%@eQZwd1F~nw% zYszF>FL`=t_3$GG0iEM*g8U%yt&p;vlTT85r7~KcAjWg2Z)ew%D#R8?>0-TG;>c{< zIq7R{5c#4c)m`nHsjU2|07z2yNKC56OX~~RF{BI>l0VB91%fPLH#Z_DYMSBStQ)~4 zenqI)KK>4@5Sk$PO>Op(|DHiX5mKI)kC|**xKia#v<9FTSDnV~!1&VbUc|1Vf5VJw zd2Asz3JzX_h2|BBqlyPGN$$wm_#-#Zoh9svrrIak%TtX5@1k(-+StSCo_U zR8&|DBe64bb$l054!A(#rO*NcYj@-Dz=`Bc=_1;+Rz_qhZ(yu1M2lyt-!Z`L|KaW}gQ9%nzflkoMHEp& zsg;rjL0VuzL_%@t4wY_6=|vEcTtG@{>F!!OB$i&fySrgw*^eP5d=1<3s&-Zv#(P(XLex9 zaTI@koQFJ&J5f;kdc-7i-&#FGrA_1N(sWJ8z|OjC)zGKeD>`PDrH;2PoN+`Smv~Kn zdVWT$YFbbzs7D(ASnlcAJzt5@DG9k`a+%e2V|>SGPgIr?6L58%tx>e~VNT@a-Jbz7 z(y5Q7hpxR9rfzb+wz?koicn{^1U_RhtBy12P%*2R>W#?$OuK%tqFpF-ILcAMrTJuk z=x>*JV7$F$b(4U@iJ>CxD^*&NoV(H=1k~CB#~Nd`y(M=T#s&IUpW6)Ee5ot-2x2Gd zhiRctX|DaBI#)Z7Pb#VTC-E~#ytNh7v*{t?kJoy8KBh5NwKJ*vz(+UvhR)ex@Wlkt zqEUr+VO&N5DPT)7oc4WgOGxjaFyefcr+1mA4lYR029mC_!_QCG|CnwpD`nFegc!Vw zUXx8ru^es4Q7??K(R%BVW_@pBXR0XKn|*WI_>^waleEOPgG20OSqAU>?4U6sXrB6; z$m0N%GO6d26faz}@syE6vAZp?tU!+9Vrjg%8BMqneat(eF+mneQ^<33moKu$;IeY+ zg|9*${8V&PQ>Xt??P?E91zSTaX^A?pH9N@_rz|w@UukF-J1KV-$1`iY85xTj`3RPQ z3|`{nFEh>GMKMWbPH$wkguN-QCq95tNkVV3TExneza9CB&e z^N~^^yu6c(BUTw^l3rn={Zmc#Q99?tQPNA`xsew$6iN0I(_&(ptU~9jEx-ISO@%Xa zi6bH7W;rFM*?1~gg;z6EMbyb>c=f}~0(Hc<<8)e?d@Sl(!fm0_gblGb7!&p?GL+Md zlv(J2O*W*6$fdYT(m(3&I?;ZgcmT36m0F00f$(fww;wl9?fTkF^(1~yH)%Rc?opoE zPl?1QNHX&^^T;%DG2Q~1R+`rGAEVl)yiWP&Y_;LV96=v5xul1FgiBt~>GPJv1hJ)M z?TcI&=0(dq*`}hjwPtLm2Cw`b5GS2%ZfBgF>0$fELV6Dbj0Ir%xoj1B4&8|zyvFbz zqn4Aw^5DHEYob(acQiGatkP`kg4kYZj&-|<{KzQKCe>4^K0{U&QIg9jd?mSrot={{ z#0uG|MW(#OA`O5N7GG+Iv}0E7rU;Z)1=goZ?J?J@#Jze}-#{qLTv_yPg3_tLUAn|d zzGVN+$dB6ZO;`~SqCdZdVC3j^@$)E{3mqvY0NjIQ*_cRymRDe5J5V&tdWG$^RbkR&KQ0aXbfxLhRL~%FOxC_*URrIogRXgZLGihU?u$HsLK_u7BWjf;EV6~`Ks4rA zqXKzM8n4;d@@nybVi!3RV+@IZj0a;2bdqr#S^FxWz3|QhZvAtrW^{4_lf8)Qf+2SG zdk_2YD`G=j_4T}t1^xqxznTY#%`5c->B%an~13xH%K7zR;?0K!L4CdZIsL8tF2eSel>t37&sOwH_ z%sivji8wvu-1mv<7a&5)vBKnX^TOWun!8<43BOjDBmXGNt@2t}KTh*}&#@Q3dFVzL zEat(nsAeStUQ|nJ(Y5g$raxClC!jzvjnnV3Ce@Y#Te%se(DowYOw zmc>Q&3?C{|l2Y5t$XNEO;e`?O(3gh#n9SxO*}M`%@+;KYcHO4;d+#mQ7{f@5+DxT8 z1;&}ywmE`=0+v$-JS9E#>_4}54q=kTg4Y+fQW^AaRC?pdOJ7r4T(I)`Ej$O!dMQBa zPS1)1eBunln4>Ue+|G9TBPISK=P|r^`Wvgpq@U5SSudIy=T?4QzGUAt!ZWU?_{oC3 zf0HkaG4_*G|D#I$-$8t!@BY723yyO89SzVJ+hf8nogI~bM*a*Ck=6TM%;DJa(HFE@{Um zpG2nJoY@>i*Tg6jacR)I(F4OnC3NPY9_Yi|KtLL&Q2sM5A)IgG)YL2QV_Z+JMH!Ei))E=|wLh+zNLMNvycO7(@WPJvj;*AN)sc1x1%2j1(8zlm z>IR((;(3u^m}ef^eaWQcIkglofEPV8X~mglJ<1A0nuvjcNp>9^d(pjs<2;RMEqVZ5K%bpkb;IQ}>FMk+!-(p? zq_&AQkC45w{(ZfU_hlfj{h21}{Qa%X&{7)p=F~YiQzOQDI4+TJ;yHG8 zk-{7SIkwt5ReDpB+m>@nbl;3LI&HLuAInBk3jA98((s0QQjbSIc%{Yv zhR~s9e_wkWPameX*-49Q35Lx|VyN|;AKdIrne=>u24{5KJJBx~u_!%NTnW)~E@~Gc zC@4SQT~9SxITV`5oy}#w5PPA@nPiDG>E9a8otmqq{ji*Jea^QcEqt*1JfM`zo9R5B z_QH6oj-Y~hN!|WXdLDPu5L;1u@)U4?g3SQIJW+OQ1a&6I=j>lFfmUmwVmT2DdP-jd z_D$=F($qWQc{iwX-hTuQDedle<#H6y*irjyBj@xLwX%8Vdma5_In5%|ZE8*rB~o0R z3i$o}N^lSscsk?XZ}bzb3sar*Pkj^fW=1mYFP+l*-O5mTpCPxQo9PjEsn0X#b&vVL zl{(u}vCV@6f2#~%`xbj?vi!%1oR&CxpX}@C@)^g+i>U{;6y6Z6wTXs-C(3Dx^mKD) z*X+CeI56Yx!(2jngR!!&RFV=(M=43G?k)P+4J^3o3?c+3T?GZWcho=krgDxPaj83s z=i-I`eRxkO@5JNc=#3CwYA}8QT)mC)X~n z+XPHGy2a~rG4EpbzTAShVPIub(^XzyY9Iez=N>k3Quj+Gq5gdOOd7he`&YoqG$W6t zM_8k);7$-z=SQ*_7e^Lfp|E5|;%jtdf&=5Ks`XEC6zMUDU*dRIuJ%n-4tE@=Hkf^D z17CRVg<<#jbh$}Nr*um!U_dWmJ3Q=aaOPcpPd%?U@Qr&T9i7G9w|rV$(_VO7e6nPp z!hIjF?>AVruT?9l{_btPfj4I0Kuq-;!Kxl>M4{GJ$MAc4a<%1o%H8GH^furVFvJX7 zzwf@&nAnxpW4o6Q{c+(tHvisMMrCr{_OE{o^m)y8#UXf;q2_mAVs^h--_N_&+w<>s z`MR=VzD4No%aCB4N$P`bZ>k;EnHrA2kW2*mX%Pj>?3KBc3{^d7I;GGzRTNr#gT$uN zNKIk?B7AkDmM^b!c^HL%GwJgc|Lybnnzefmm#$cWegObZgJ}=IMs+01Rz)|?zCH!W z^bKTPa`Bc*O|erFeHC?H9s%KX=y~)Un6uH*bLg*4pS~ipn2ncbjFOew?6g-vl*yMZ z7U$P8gaBJzzc!6f?i^Yg{REaE#1oA*^1nR1NgWtoFf5_ev^EmP?)pl|yWd$mz#*BD zciy{eBVSolXk1%oj(UztGQaNBjpBo9W!YPW*B4}f9ei+J?3dR;re3CqZ@lY1jM~0tJ3etAy5Hm_5Wo1wd|(U8L1FMHKF|JGk*e&a zH`RCoPHeEO$EE$ym$HZR8$SgJz|~tBj`xnyRnBRzG|N>xcMA4nUdP^bCWDRnf1a#`ky(&$-Ve{;ri7>aq=MsRbtWGHr zv-17Z66~VB;__iL`pjMn{N7Z%lnctgF;eXF-M37`fl&UHJP8)u&v5@K==%*{EQ?uo zQl*TrxTg~0vLr{*#0a$vJH8}uMX$L!%jYztpCUK5b^zbAktV|+TUdTmTpK-+daFGr z{^L(Wl1_Zt-yOFuwVu7)jg`mJHRUpHr&+tu?yYI?S9D-f8CR=%ADl%N(x3I(L3!HV zpLzUMpni=mfIk8e(o_PzQWYlxtY1HKYEI`frwL2E%dmLdM=TlzB=L1 z1^X_QzP;*Ta`!Q}rrIe1G%)AwYZH^j!{qm4{t+NJh1z?ZiXvG==a40_ zME-5NtkEDvf*+z^CCDks-J56?U#>r%*s-&(0`UIx^Nu*=5&$_DQkYu2+h) z%T|H($UHFt&^hl2(OF6~QA! zWUrJ@7a(+o61jYPen_wiul$3DqVi%>Krd}CfdocGPWW($mKsh4^lL#cVa%6Dak&*B zL3yyit)ly4ItZrn*i;uvkf17T>%JRxjuC3uYRqlwF8{X3MFr8@S{mx+;H`xye@^2g z1n9(wIngFp;L;M$k3!{2#NAR683!Bw$W3OR4iI;wPKPRCL8#`61J+N+00+B&^bV0O z<#mcD^!Gk6sC?Kr6O1)`c&qife~#kH_m&^*yTmBa_>Jsy)tU#&z{4Hv?kd?(m5^Xs z)*Ha6MySU1@_xUnPY0u&=<$F6+@qq!-j096R~CigCNC?%BfkKBt~!rrfr zrI5Zp+4C4+OKrbjdHH=lbR5dGEp42YGi#$M%mJM+L5z*%_`bT;^)&j4wMj|Vc zH<(YXbr^=K>?I_4^g0-m?`5yZBYOqGv@Fd5ZgJuH7Y!gKP=OL#7$z%Db$*Xj{J9~> zD(7~@^KdL)m$~K7j+s!Y!Zp4F&lp#&?8e2lmk-6cd^h^flN z1YR}=;E%B~niQSTB8I1aO;s#4J-nER;`mXXT;P4}I4cmO@gE9p8VZJf0(67I~XGHq=h|Yxa+$2 zz_eX8$)6Uw5P>V2{(krw!O|g{KR$*9gZUvW!{&SHKmuZaF2-L)@F#WLBPvo^nPw;Xy3m-<9xk*D_OtLF#DtLPAZB zJ}#~RmkvUe<-glsoO|_Y)f{zHvQR5xOnU$N%%DmtbS^Q`E(eytmROXP71_t%A1QTu zYv}KdQ=)&cu2Ju=~b5$$O9{l#wYycS|xKee={u+=(F zN1(I6u}~tv(PZBk5k?By)lN+K6#G6d!;VwjK=c8Y*Q=$(1-&!&O*~{Bq-KitoVIk> zCu5*`i0xKg5!AYPEt1d?eNXP!z#(xUO>~qo^C|0wQCMeiV4B~s^T(r}`9Kh_qq^)3 zvg=Q8NEla$iVjbKwuvOg_cvZ4;#tm!d4x$Z;=%HW3>nAAG|79w1VuA~yf(pJLjNfA z;G*Gsu`h#|cs!;A|tI02C)ox<5eWW%(ME6z>6_wCfwUU~AP)D}Ht)qBcKm#9Sp(O1c{H*+?J4DkBeTuXKYT6=E( z>O=g({A)*WU`aA4v199{rx>SmU3e{5L+VOFZhpv%+;|ZMRaqh$`y7qORG(yT!KHH^ z@V>#QaQQSK13N858BHky+P_qK&To3NDg64o;zX&jAvlxL@-CBB(n0hIEGyKjVL$$3 zZ3a``Pgc(t(SP$<=VmM0ZVkw&3i?Wn4029(_)1~X&=mCPb=C}yd&W^srxtTY7(8pB zQz)&4^-XqMFK@K9S=;$~HP6|nYTD3Iwf7kaT4&DFDe6<<`oUO)Q+zRVnY`)w<=Gb{ zGn;YvEI8rg{gAcxl`{qsXs^Zw@tsb*<7@u)$dkFV8ou4WZNPFLZOe@p{^22S>YRy zl+AUrOF0fkpcugPFsBu~XA*X^^ss1HenIVzyM>}&Qs2)$J|vn(C3tH(@Av$R3#(3l zVb`B0?>~{INp53i8)TME*QD;n0E=u5nM<3cIyOblyESkbeF;kh}?O)Me zS)_8E;Ov`ved*&gW+&S^Jp2>ig(uU?!Sa=1vt0 zB|(&O7h^7B-7wk3(M*SNd6tv;zB2sJ&cw_nmyblDb*6BJG+NdqD^-VbZMA9b2WE@^PCYVk$|SS^^%mFbd={x!LH_g0fPK1^a=N) zL|{bY?VVp)YB*O|9{a5N{zQTB-e=0M42pNt?{k2LkEL7TJBKyWmPM*wZcCseOWbGF z*fx|AH`Q=Bg-0M*_S!{jB5*fY2Jh06UOaqX;VKGT)~Z7^RpxdmhM1frfExSWh?hNV zp85qOm`3A8K*=XK`Q|I2?p)qV&5R7gfu}^J(SX_K+L5n!=@AaPu8mIvPQNO@4@Lq8 zWVwVZ6J~&#`z@{{K#4*@BT;cHg~O4)x`v!rkopT1*`nJ6Q(q2#r1W2(4GM2M8loT7 zxGZe*hqOM!#6$5kGS$w!1KJ?zK8ndk5btij4ZvETr5v#-N_N>lxPT=^g!!hur-1h7`|qQ`uQq1a(hhn z?As{wUrBiHN33qr+G)LNL>Yh1ie$y~YUsXUwfUGMD11nB;y{cG`gRYih!v({-O6yE zWe(A|B+?a=P9;t)7nJeRY$P@F47=es#Ep$CN9`Wfg;;)Ufc*?ui zro&qOk1`^5Y!SpCzGy|sh0EHo|FmG;OAUr8F_|3mAhtRYHD(wK+g!URKg#|{yWL2T zEuOm4oOZI#|8CQ#r7Flvg^*qAoNen*gPw?hR1baJx4S=~sXm&LhKVqJyQ8jGF^xGX ze8!#LElcU@JSDhG(X-z!&eb{`=Ca9+>zh@iPmieEc?RY>A<7D42(+DBFhh_jW0~uy zo(VBRm$%pL@W|ZuDKaV7JvnrZ^C0XEDQg@R_j+2=)3$2oYt6dwliYRh`vn3M5mw*? zR2GS@S+T=w7gRWz0A2&yaS4cl+L-)PA#Y4qr+5`zB7I&6$V96T|TmBFykoC@< z)#$u1OK|#dagxEjMaLH0KRN) z80_2pY4I^={6#Z$Gb+eN(xNaQ>-Or_hDwe=#0&ZNOWnJE+3<|Dy^9a*j|H@(fc|;g z;R{F5+^YC?sl^Aid&^ZaI*KoD)9E;GCYmu$Fz6HYC2 zBM+_qN5FwgB`8@rLBGz?Di9DoUG?%Vn%4S5CTz^1KzX{xkue-cJNWiXW~~yoyt|O? zvEW!~e7O-XN_t9qgEpvl*cJ}Cl*p(AlfxnPT)Vo6G*s?eMGHFq+g!P6DV=^h4?jMQ z-kA#eMO;-HqsTOP=odEb8bIPl~)19#Os@Exv%-ZfWb_x)R&nW=Ql zib4Gp8ClVt*^!js@f(R*mhn=^1C#abMz^fnBv+6t9}IP7(LVyFz2XDAuzMY-JEE*5 zS^Y0W41Z|e*DTzK>+p1o;ZY*laoLxne0l32^-9T7IwjtX0u&n@6< zt`OSOIj$A$Acg#$lbgzrSJ0_r_PlqEtL3DwAgJZ=Q#LW7y|W@Ke4fcb=o+?e3#>`T z)ek{`4xiCKorw?r#YQFP8~a(=Gbyd)_Z}W>0LtmQ0;=7=U0+2e-I2r`Ej755d83W@ zfT*{7S%k)QRb2R7BJ4dHU}=BkDrKD$PFA;fJ1%wvX1JXVeFr*eb=RFw;oM;{oGTEH zb%pmH@gjbOOyqb{V!c~d(`fhpw4;+ZrOQQ$q;_jHZX zZa1?fjy)6IjJLvmoxcCtfp2<769OqP|NhFgW`bGf{?jgDqVd7PB?v@%ymXF}ppii0 z?!rw`-z4S-P1>u_(6=zA{BzPgSVHvacFIxf*1eNt`+Ll76Ang867iaNil1IKIwI$@ zW$bKRQ9u-mx#(qyND$fEO2SZVOWzuJd0PtHfIxrZ>+MUZYPQz7{|F?(02paJyYYJQ z8hyPqSrPvrWKt+9USlI3H7-B#S_nO9xcd$lAhk zcoWpM^M!o(6@`iZtMalLSqPuMWEy_{T8S;KidX7w_L=b8nDL(OrQ#Zm_b+NdYljCs zKUAAZdI+&Q#y><_7My*5O;8U7`4fpFr#U3v4<_`C3!Lg`Nn|J75wTj6=OR>Xx^sa5 zsA+QNmnj$DRDZUnEf&-Ejj6Hdt^~f4_hGUGIQYGR5nhD-szy} zmX(B{7R7k?ciU|O0CiFQFn_{URuJ;pe8O2r>G`hVx&IMZv1gG0VJ*@3ra}s`zcO)At`&Gd(R0R6zK`{roVq7IbVZ$VKJWaw=k2< zpJE{I>EOeZ$-7?}F%-mse3>L93-1XO_snG_B|1m*C8_P-7bL5;va9@!r`_+^2K*XE z^HwEg_GF34^GyCt{eQ>s-qEblbW4w3Th3k?=j}E@7R-u5CoQWcLImw`e-O+`9H(^2 z&f1-@%eq|w4o&$xHU%@!gN*g46u%{jXW4A<=K9XLB}JD~kRVyc?gkFPjY$EQ_}k}> zm39epIIKH0#l(;v>~GlSfR8^edzdT@!LNv!d~+bRF_XH2!HU|wB4S!9iNcxdBa- zw1m4hia(+8Q>S~56UU$xQx`u!o^$JU9OO04u5b1~0%LM_82$kxpd_x3+rl|)w>cwt z2xa@@37{xRlXH^y^z7|NLEaWrd2{eb(tHOPS8BzVa1aJgMM}P1p=!@Tp#c8A|GMrB zChGWDsIgVpK}S99h3%gl_5;3sFUcycxs3Pr&2Opq+D-S>F1dz*@RbbE6KQT(UN;QZ zfpbXOgX57>aen9XMJ9`{rtmi4YmCkXA~<5c^+*Np7p-^X550}}5MYElE?WJ#7N=X; zn|8G_R_{rbeDTuf=V1P)!E4d2>0}2q%e+)7nE^!lNV@_f=j-wa7s3@8a^zl8=4|eZ zv`3^)eUA}xmj2r|mVJfSU+PbxgZV>AWw)YFOfuWI_JEZh`_>E`b8^!_Owy3j3&H3u z0zN$WXuwy|(-HsY26Wv{gCm^OZH+%VJ;;j}U%q;B-0&>JHRf67Rn5pqKV|eBlGXV| z*Tcy8<$$|rJ*g$Mji$#2S|Kq>g!1{J&W}eP0c7LPF^pw2{C1BdlpZ22VmR};$vy?{ z-qjC0V<4pj1FvQ6xxS$z@Mfkl=Cw&)j7fV*iZqJlV`OyBVqL*wuuuIZYu}n{1SfTy(lN4+e|&+yFF~ER|b#&E%&r=o5nk@`P?RT*3$Zv_(oj@B9j5P%@^1Z*V=x zu)TSU?Hy3p>0APACDJtT)H}lit@kO$JFm)4eo8-CgULMy{n&ljY=SOnlFIT$Isd*< z`RjgT=7N7RmbttBway7Y4QSJg;rpdni#5E{TxJ~x+RZXe4=uq1d7bvY_M6adpyuu6 zcy`fR+z8aD3&4xXSe!R5ZYg{Ta%tqnwPbP~>rDjYF8w3$#>_2UzfZs&w4$b3O84;U zz_!B+yakB6OR<(9NaO+~@A*H1aD{T9%r^yHYN(t zuU%Dv`eptlFiC7c7b6Z<*1qxIj6s1_qSh2PyBB{BMNPrFmcl!Av2NR$;EY`)c(THu#U+PynW?ymRNuO6zIdRNN z_r^Jv@&b$nnD_5Rko%_5W8k?^r)NV`Xy z=9STjFqNYDy%SX4_#F+m=MPc{xcuN_GcMk7hun`1;D}1UZ&M~0h#Vr*8BI0!Fjeqo zEcBdQFSwmNu&+4mcx*LMq23k5DDjKiaDG>@axV@oU%}Np#aLJ^AGP6u$JL zb-q#RE^f?T?jHdu1VfT*Q?@aOZM7XLJPP}^|ZQUgmGr#{42$}vPNcZvw$D>YnRc~SMTxn-`s!H>? zejlW( zN5c|O$2B*|Eah{sgVv=O-Yj9xyxZS^rwsmB1B}wwOPHmp)*{1tWvI@60dR5V|1R#C zfj0pWo_r#+{7e2zY+3A9@S4sCbpn7dFt=X^tXF2~V6M$W4TDp4bLYVr@1Qy8PmQq? zJ8#~W=Q9VY(03fjD@xZZI7tgtw*&lNP?(fd|H1#B3nBC(*Nv8vOLQrcV7W} zX$YMh0!je2(2)l6>u&hwt`C$959)9v@8XY$wx-oVj`$iUX`{=>YJ!4rd45it*W6`E zh!kjet&Kih(>UNmSI1Ctl7dr(FZO^OOt7qNbIj8;B)@3 zO_?vyCZp?r+AQs7U;)!Pr@*yVY6Q@vc6I4JwAJ?Hf7<*b$c_9*fbRpo=X4Bucm~=> zZ}Q)*HAypJKi-Z$fv(lD?B#vnk016`=YsJ?VftE;#p3>%?DOsXJPr2a5P<_Y+{bkXn;KHi>U%hp))@pkXil8DfgLg~seMKzj}zf(yq)1EGYU$% z)3vW-a@Q=XqatZDA_^|GARkPQ=S}*1q9AQcKUrZJz(?er%?F+Y&pSu~0H_h%bz1?m zaYjszV|4`YeN$mH*qH3M6H&n1$^RpexsXV>_VT%%A(7wm5DU(7EZOlBa%~pJf{G0| z$;Z7R?DZ|{eVqJtuh+;^aU;MC+N>_EvypGo8J1wDg?mdubo0iID{mRp&eekzhLifS zPIP(*Xkx$a%>388tr9FM|Kn9SfSr9igKFeZbEBg9E%hYV??>aOFLjLgt7hZQ1>PxO zzvX_%*0m-iQiF(Eo)O|mx(=fdVP9)>T83}H{;UB@?H)F~A z{!Z0>k+;ynyRF-dP2dFf(+dOZE70+vy{!Sz>lDNEFKcSS)Z@^(n;Ep_f*f*w=o7F6 zjsTXxd!`AVKBNyqhu~-Lz!;K(`&eKGPdI(7v5f4fW($mIedeX5^p%Hx&Md4P1TSlV zyETt|&S~yl>d67GXMF1zyKyKL;SK*fQv%*1`)?5ceeI3C6S@cv1X6@e$1tuw);mAO zpgVcyVcvE(8Hb-);ZCBn@M|bA<(4!%q8WQQ@jD05Ez1AeLQe5lw0^Dk{8&H}7guv* z&{p*a|U+dIj>lApt70cm$giBa}PA)dNOU0hd{I7<_;Qy9$E(SV(9e)j)5A&Zi z<_`XbDYgu(cwl^`_HZuEz5fXQ2DLZ=o&2T@GdCI8Rgv~u80cHc0{;kxrEGx6V^ZTQ z;Limrn!gu2jM2M{DMq8M%yX{L%$C}jW^ddooiB!R<&LX8y)@{mt`qvK=*Fb(6xX`& zer;^yx3;P8n0WFZ&)*oVXK1^4z8m8IJ>mDS}wR`h0fOhsSbk78W!&?qAA z*Nl8z?91Sj8Y_9_9Rc+QnG!B*KzWf@qWyxg(aL)U9K_S5RDJl zeoGe`CBhu9kf?r~7T#A%ol5-|;rK|sYW5D#plRVHksPBR+~gR6IN;8i&5S$Svksxu zkZ=Oh+MKRkxjvgZ62}IQ-<8n%{Whe{()-rE7ah9~TFWZux*1cjd(dq8;ILZqOy#0 zwMK=xp4dAi)Ys#u#%9>sN>l`0c1%u*Ap8)%@XXs9!_Y2VOY8c!@80NbGvmF2h>041 zzhYsKBF!4k(P>KX;WFSGknrXp@$v*|bX1h&6-lEM(f9k)qwntQiuI!p#-Xr=Q#>0? zJiqMSH-+=*YmLmDDAA;Mt{2=?q z1DcR8tlY2Sb_e5_ryUg(v~Q9?z1okT3q1J1`s|)0bmH0%;Cz+f0RMjJ0H4*$nn1!& zAA%e<96A+zKbN+hK$QTScB#;VyJlzCp1w`s)dsFuYvy1a4DfoDB25KKP8%?Hi;5X| z#Dc)W>n*0AeO+pDjSWk-hkDlK;x^*3qmwGl73K0Fb7SgS_p>W?G@2av?tb16O!7p; zT>Cw6v z+kuyX53;O3e3$I>&CkTfZGLRWE2Y)Leg6jSmc&Ufon)gD)eO9=d-g9Uwbj9_ifTd4 zZF6~xaL9S>?|cRQ?cg zbb5G!u3g-iOlj_mA0}t7i{514$`rUuvQZG^>m`j?H~1{)=5=r?Lvx*KvdnPXWDs%9 z;fg?l!{(rk(v175BM_Z&Pp^WTQl9v|dGA)yIsnrWct9m&Fr?`0RzoSo{%L)Os_@A( zC3%`@GaD{TT!T#C^GnE5>e-+AmaR`)-d7*KwT)k<#TE!lqN)U`*%kc6dUo6An_l;M@tMh(TPD#RpaXtZ-b(j z;?LY$6qub1EU9J|yaV$J%5G}Pm?IFR0$|Rg?fRBE1$lY?qr(>YtO~*}dztIaJsLNcT<(upJTJIaSN7M}8n5a# zmiL{RB6_kHew+^7qB-d=YoQrDxyeRT_Z~9tUOP@)eaIyhvp(@orkjxBok@02<^)-8 zeaR0kdD+M?&D2JiWAk=PjK5^1{4~h>aPwp!{&HWK_x)GNcO>gvkXZ@tx*48t9-nDW zsC75=9{(tKSpOh^dq+;yC9>9g0n~440ik1nO?!vk(R@P1w}w=8;JAl<%jI-{$omOy zv(QT?lI4cbl$SS^-5YV3hu@NxvDX`Pm`ZRsY$XK7$HjRP@;G@K+Hk$? z@(OtYll?9={`1>uQqzigFnxiSD;P2&%V4 z*OCHq>eoY(7rtw>UA!q43mmpaP3>Hx9cspDcS(K1jY;z-b$c(k{oAJTvUMUX3u|$! z5?Ml0YEhzTUR`(SKp%Ojgx=c{+~UBu$~wAxhZs(zq&2UU!8Jzj#>}c|ckEI!f>%8+ zN4|I@r4>^tMD1}9%2Fc$$0Vo-5aKq)$lzFNqTytFb|H#y4fFGz>MwKKi&QyO08oPn zKXG*HF#vZWKnHa-g9p${u!-N<-hwkQPy^dTsx^P|u|*i*Mu;SW?ch9@;oevb+K4cL#;r@Lqf#u&=N*-kTDsK#T$lsQ13o2w-?919YgRqBS94 zxpNE@){ME>y@<#S_cemD?;$0RrCTlu&vzRVf?UR}1%;df^tEV2a3=6=Pkakjo>&QK zK%2Z00a!Y$It%S*1l|G3$O3A|OFgH?Y5no{U(+uRp8S@j*nMUG$S(>qwPy=Q7kRV8 zlSR%+I>wP3W0|un%_M4Uy}dhJwd-NPEy1qJD(mb2%E>-xJpfk~m3$ZXbeZt*IsaZ* zexo_W&Z+sQ?zyhN2KxTnvsc{Zl|AJz(jA>_f%NfUbj0D7C+z~~qr&)GiK}3^`cX}} z{Oy}cd6kd;Abns@po1#WYAo~60)>Bto zGfnYqZ05I8$jOakk4)v)+agE79g(H|YpcCcyS#xh;|FXOV}A!&LwX+*$~{u}@uy@kKU=F)SHWcv3 z<(auBdub|v&Q=EU-6FF}CjVD{$IsiWCl=lw-FbY{K7iT06d8kmBtf>n=GxgB{$ork z{EWY-;jd=}<+c6?{Bn@w1?9PV_lX?O+jmSh>639C0%Vl0_|Gq21|}T&JUV)$8*&)UGRAXU$HY->AgW!XlpSngzjSv1mOJ(f}pNON<4 zGc>4Zj}#PXz4Ix4EPp#s4Pa~Sa^%Fnl@w6<^pa)o2${gYW~8RpG~Qc_w%=WD(4(RpqYAg1q_ldp23 zBPcUNi8!|l29fZ{he;H8AenA*V=gz$Ty0%Y%U(SoMt8Z0XTOH~QC+?#A0KN7f&E*q zC=aZ+seS#FlY>mUMXr~tlDsS6e5+M&qFdj*#5%sqm6hp*IIT(J$i?wc8#4;4eg1q- zjRiRioeJu63FIZ@$%OT()YX1hErt#v(>oA?WwwG z6(h(=fBytY0_!I>w6;-g?q)Za(mUs1P;f5=QqWU$Bp!a!gS5anY71qh>=yS z8bTx_viZ1F;|)__YF9`{0-;?qBc{EFm|6TGo3Ybwfm+M1uAWXy-Nsc%m&8mZ68rN?BGnhrnAu%(sv zK)Hk-)I-of+2`n}8#nw8v()m5Hf3MEUN0Oc0a|e)>!OSd4IR*Kj>8N~Ps!P3v zr5D`k2)x*u&7R$|`3=Yg>YTPYeGgHbGcRH2UorZcJXWUy^jt!mBx2inj*!iT6H|Ln zmhP=H?_8}F9mi#E)}Rm(#QY>K<=v8oBcOk@Q_Jg&UDvslwO>YP{A&wseCYhddc&yO zdH()8W_>Soxt$mBwW~TBan>>$n``9`)wAGMBwsBU+~mm5v=^S#n^hU2n$^%+83f%+M&t=`7ySAV+|9tXse_Uu;i<10mWIM}|f9w6yv+siTO?(4$ zPBjC9@^U7LDOq%!QzlxJOu+(ht8|)IU#L#6{T5R{8l&Z$L5IksgZ-|rpD&4qMNy$}&&4ZG z9=E8TjEL$Y<=Q&~&;m)=&XJZFafAewfiu3>GR(e|GC!|lU9xIt%yitiTS*Dmreyte zJ8E&VypB|i6<*sVR6tuLOCe02)EJHA^}!)Z()iT6DW z@W*0mB-XjC|1PROGnE8pW^&~!?lLwx7ieB1Cjn#48{2V(0=ATQn26+4;p9l={PBUw z)*JE*+)h%~#sreQD!nx8>FyJLq)1D$Ob5@~n)?+T@v5Utm9V4i-|+u8fcRl6eT#&9 zaG&vb+XcJE3LPiBzjfYBP?%A-+(3uucJzz)E{AqMoRkHo4Q=`wlHb1Koa$@T>ON|OWG=iUxXN}p&LkIcoF>-$rK%`2Q|o`FfUHC$OdVkQxSma@?KO%|JPpbW!p|80h5W2#MK{b0Z^> z*%4IqWWMSU*0aHYrmZ1^Jc&b8-Qj~=;{4F(Hqq?q7p4J6$`$9Tg@VBe;?BtUed?hR zH)SicsK_lxjct+@V*o!<62bqKx+{SO^w-V6((QjSPNo|E|MZV>c0AQ5kE`cdF&!IJ zK~Z64H+-ES69O3W>Sl<)K7rgBk_VttH^#dxXh`H=DIX~03R0#IRc=Xt(}=kpzM&W$ zcx!SPs*yKt66R-rBxEi$evb(7Mr)RTtGcX1#eM)l!jcURzZ1+=WPMs*D)Njzc7Q}E znRD5BG|csVcsEQWwU7_o9uFvELA|*1E;kk(yuep<-5l`!}d=jsCv9)t? zY2XD`RmI@omRqAyvb>>w#x2kUASiJ$NrW*cB1AnxoZy`-S=&x?n>WMr|AVu)3~IBB z+J&K%;!=tfhvHtmIF#bW3GN=;9fA~>;9A_>2~H_q+#QN*pjc?Io;+v1_nSF0=hyk2 zWagIawb#DZCGY%G&dcOpdw;ws&)3E(YcYX5n~VkpvK|-GgzoZuHvaT$Q;PMKfdZPY zjBv!%D2b5q@!S>)ms2=5wyVU~0WoonAVrMb^phsu+x=%F4}> zKNIQ$K4n)5*ppbL{g}&h%2A?^@7BBv$$llX=-WVvD(VkLidJPpB;zvQ$F(Sxo{X`msA@ARu~pNL3-GX3g`ehb5X$ zz9e45)>DdIWh30E{UZCp_dnP?C%xs)o!M=1h!*Do4Y$HP1PCOs3j64SJ8SB)mfo9FjMG(t z>wAI~3ig(wk+lAt>GvGvmTWwBd0Yr%0|YQ5CE9sOV?_B0=snu24C4c3jKqasM_WXj zmBg3^vsOL$AnBq?s^KQT(@<5YudR_-M!C7%&euQd+B&+qLy)+!^tTrt5e&%&E;Hw= zzQ3RlsymZ>T9 zcm*N(bN<@~lvsHZQw`cF=&2%F0gZ@sNSw>v!A6|Z{obu#M}9OUi{+`l8ByrWn+!bw zR+eRMtPRLBJ#hx*J;OcxouN}ZG_{NSuHZCfVXKrtC(N!|29#Lv@wx9mq|jKgk!6 zZ+&4`uE2U`h@^GGBlLjp;IJgV?h{sxc}2-DA#lA}<0fMP3AL5^9OJ<@vr8Y7_bInd zU9xW`{|fdtBTWOCr(i?>P9L|}pmuPYJ(*tX^_`e&5*BgCQJ!+&o;IwCN_)LnY}5cM zMlZN~-r)~h3uOJ?`*0AxPQS+Gu>uvyN^-xeC_$49oT7a0t^wj*S(+3ZV1j0TxB`kK8o zjc(qYiGhZ8TQ2IWg-^;W3Hfi!_5A|kqAR^|jdtZ1T^=L3zBEPWIWw?;cC{Muf1xMf z+bEG&?wy=Zo#LNa2xODQp*$i}Qr&#TL%my(UQ15I31|mj-}#xmfpFl0_U-}W^jC_v z>po_76zTJn+GKTA5%RaK&^`Rv3c-I!hW-)Wu@*!xNAJpQ6B{UOapk06v@?|(q1SbM zp^;E*1ggb^fZUv+a0szDgd{4aMar;95jMEQfdep0Ad0KsC`?d&ON>nzY1tVnmgKfO z@OY@VF^4asdR;GV?>o04IlmwNAq-4K?I`*{LyFsTJXxAnJ`U3{nKQR%St?=`eIa*( zS67K28Htp55^(|K=M@N>>=w`5h1_W?iEW+V{N;o)Z|r;93!S`|yyU9mHknHF6)CPuggMTQJbx8#Vj zaV%C>J~Q78Ane)1lYAyEY}ji&jlSCF(||_BgzF(GBrO7qeCkTb6)_lAqf40s$|m}r z3Vd-Ym2X><`2t^?@2%A7F?8nURu9LB247R<=YL^H-{Kk06oNn88TIt^?oTW)4ye-C z*O@@T3cj2%N_M6cpJbC#U2mTd9)Bv^wq{?v%bHk&Vk5}Mi%^uN|1h}z6!?s z;~~ApWG&$gN0Tk4PR{rnZ?mafJ&A*gFTWYgMH>8ABV(T+_fAtqJ@ zAv0pn3rL}@{BitcP0zY|ga1l$7E?H%SiE4qJb_k8SqXE9{8eXm5)U`hpn2q3$)%GTww+N3gw ziE1oWV}iAkKA)C6qqQz+P9#g~RJ;nNLYb!mol?Gn)akE5*nB7cG&K|GrN#96%p@Qs z@SS%0+wYUuD|Og6dXi6bXol74R&l%S3sNbu9P&z$#sjO%BB3&rU)jrCqWY~cFQ=O; z%*gCU)Wy3cY$WqfN!VqtGGQ&W$~s1tAG+l^br;}A=f}vk2m#6BHU50bDrPt~(9U*^ zl!u7fnDzL$q%=K`HOtg?qOLKg;dPR~kuoYqEsn5I%fV*TBGB2gLIoMgZ(*LQH)m1;dmVIbzK4C)9*(cw4)tg+9)=t84 z*YRM0@VE3l)efrQxJpiJ_ znQwFOe;XqP3jW*1m}~=esGDhvb%R_yyo5+%@O>O6c~RYGuFFkbPPT((*Dfa7sK(!c z0QUS!jH4waif6IEe@2W8ZbuC1lZJW(ZQR`^2GiMG`a>vAoqUMzRjTC9PwB=gCDDQp z!V?m-!u?SN0Mttxfq}=teg%)hKc~&SyjcrQno-sI>rm65Xe6XA3YFymWx%C3F8c`{ zjdvfpDuYeYiJxC@=bue?oe1qMR)`7zMo(6~L(PehGM$1orJLDP(zxDHo&L!7yW2T2 zyuDBB*V+lEQ{9so^o^s3pzkxYdOSE4Z7U(vT5E5Kom=M1v8_B7Tu&Niwd6|6=1SXf z_V;PA%K>%7yg_KKF3_7Nm6kIrbkbA4#@DD$^0&oy>J^{R;!O;6SCF5bp?0fPad#R> zBUF9=X8)g27!RIX5-FJTnA6O9kHW%VQr?_$7v;)*5dEjPHy_aAEFp}0qwH>FTqw~A zYV%(KSy}1K$qFSgObmxO|BxIGa_f$~H|s=2sQJDo^TdD=l-Nt ztW_Vs?o*a6f3K07%i#SKco-fpS{xY3iRLmOnblm?;tTi?bAAB>;4QBMw#E$ zdFks^8{T;Zzko!9xu5q8WUQ@6#E@P5SZ@I|YFIaTrV6pzo-rT!lxn4YNfKc*QlQ$e zw>@X~=Ja24xF`Qq$3e*AW#L(-E2J z5t8vF%E;pScu4x8!9f8dmz>F`b$f__Xp!G9r@?iD^~a8Tqw<^=jOU$U&3#Y= z2r*5xrhEIObpG@px^1tz-}+?l@1N-X56Pv2*JA75G3OZw8w*O`*{uWh-G%B%nzJQK`?2&V1R+VjbdO_iOSGWqrH< zMf0J_uxn1ifOCw|KcpwEi*Bve?4uZx>go+rvE>ffO63CW@bdiOH6ez%*?3C~m>?)VIo_RYorzY^~o0H0qbJmnE zcYIK_08f0z4pr#Zxkazrp>lPWvm<9)o-Slp=*eQM&_)x~Wk@vX{bF?zuw&LXEXjEzMo9mcpY{Ss_ zy!*EJ*Rh7m5AU@S=M#bZ()bgYMJyV&QxlD~y1WzJ)1AFg61M9WyY*_!Fp&r+PhiJzH?q$5#dLdE26Je@(22 zs{Z!yfJX7PggiAp`chBpg~pz77#u}U8Y+{ct5)G<+wI6S)r<1U;dgZOd)km!(IbrR z7EK#t(;2T$3r;X!DCN>b0UEu<1BExnsR)8*ulZB#NtL+lXBy{b~Y2vmJ@DFLU zaNc%_*x!pjQ#Y|BCY?=|trF{Fadja^aB+rEq)*$HNt#eWwG)}A4C@RA@wb^7=1*u! zNO(YPvL+)?E+RDvW}+FOb_N|;%#G~zn|E1yidf6kpSU!+*m#+oSlp@d+itV3;^r4p z?noS7nvTnZkgM|kxG)Er#{Wu}`H(jZ^|!v9%!zM1gGhNgb$P@Q>(0qwGeVF<+i5<& z4hHHIh)x^d3qQaH%v!R4Uh6UnMwJ$OeU?hl{HztG7!3Sb;O9ZME0H!m5m3iOf_ONQ zE^uD7D|SyJP}snl+uxw;Y*sKy#&eeLQ=SAvE6`vKMy+bC@mM~Vq(l!olWwDAmwPW7 zFL8iX0vzogJ_f(ElXM{cLn=ZbpbM%>foV^Ty#~yC5;KIJ9Ebe6vbLYll-UlC3auI$ z-qFsxuDXjhW;EH_>>JqH@llLxh18Jh_Ycczm(^|ol~|``Rk@@gE7y5VoxSQ4M#(E> z>}YxiWDWFts%zz*p6yR=ldTIF94#3$)pQkBR-DM%8t61}_)=(v&OGDn6g@r4uWM2m zYQpstu+cR?qmR;!CRAR+g#+R)R=bqkZ_7u;XSZ`RHzD)uO1;ANLVb`3f4_&XAAAZhGC1btFEpelj;br@tYuF-cMN3ce+<|$#1z8jh zIgt$D6A{jEas_`G-KDdj^y;N-@~*~`P~S5_6d0;tbCt8Ra3vBN;>$ET>n<&?A&7gxIgVmmnt+v)xD0!yWbMIzZ{?Dji3|XfGL-Tb-5s^AS zej%5uSugfDlY>7&AtSEe9Z9@3(RY`2uw6NjXN~yyi3tCOQHkj~-*lW$&7T?P9#=k; zH$S3O^Q^~qM4&Ncoo#Nnw*`G}rdDsgo@z;36me#WuB$h9x%M-P^M6)mPA)jzM+IV!N3*Q*4?> zlVmv8YsB*pX+Y}y(BBSp?9+`xX(CM{&h_9M#d@ic3s_9F(97jMFoSiZFyu+!)(fp{XNd z^rF7|jX4V(H;NrMcT45zH;5nGvo}>J$RklO zOCy>MLkb*tDts*{y7~*Y{IMqe+DYKouOB>3Eu*A*%2FB_ukoecL{_3?G9*(*`e&1p zGAapW=_#Pf$4C8tpm^0=goFq0P-1)=?61@-u`?t7_3rY%oUYSWqO)(fOVuk7d~fe& z3A@kud-UM9F5!9KH_*KnG$ldRLt<~odnxQ5$>;{+Hg=#sGio#RVI#fb>!KnMN zSF|f1v{&4VR9EG=zURKdoptO)$TGRiuCQ?U(@sibo{WW;TI!KiD9P&o+T|mNl88v7 z6bbnF8t8eR>Sz90{aF5Ad4cJ5wC6?-|NmpR-uAPxaH48Htqog#gn$maRNbJI&GG$* zkL0c#ZbyQ7pJU!q%7R!s*r#^uiCUqjAbwBH?K8T-z=8G2yWXSD3-a*NQ2ljfHsPPC z^Y0l8NfZkTelu5zOIN;gYD@n$JU8cGmS?+%ImhoQ^eQ}Fi7ZdZ0(Mt@e|>*qg1Al* z7}fLE_Md$aqhI}FQdgxw{h#SeXW%7x7vvdHJ|6fF2_dm8%gu)wOSE78?bbA2YmHs8 zB5C(OVsxY0F*AE<>$2JgW2ERrzSj4TnafvZ@X>CiwowByLjy)81-x}Y%OWeHLLQoi z^~N)c^>L|tifYe2)Q0)jBXDRNGb`lH&lkJrole07Mhtr|*w)ra6SG&H2@|%%!h%p| z)y2v7g4)c2L}|96xD@d{H-AsC#l1wLQ?BFXb46p!f%)L*%8v_fL&S2fN7wux_ZrB(DXt^s zPkB}qGxvaso$~{A)*4BW<_o=pvn}A(xqt{J#-T&w?-*no_iMoG`H30qq*>#eE&~UD z$E720O+uv~uI9=_audmD92BVf|wn z8~(0G)wP2K{k=+5tsOu zahJG$^K2-4JRGlF8ir>oAhFO`EMpCGy4~Sr6Ppa_5GI%qrgs?p0x-(`%no!aqMKg0w}(Z51wjHr@ElK)|9`vZ&rp45X6;p(v5 zS!gS+2I7{;6FF-s`pb}Vniqe3QN7hF!kE+iNR~mJIqB@M#mYj}#z531*Hp0^+L>OK z*Gf}9KwBE>gR;~me|F&~S`S^OU4bf3CmC%!XSiT|#ZRs#5X795SD=Z|_!?2dkB@{A zt8zE_H0v4ET?2!4S#_655GxXU8S|Yds)ge4nZDgjM#`#YaA5C#|CB-NprE() zwoPl)xGN`X#V1sbHPR+e{?Ap-_`s6zj^<1-=ZXwH@r%HYXy~UDA&W!FF_an0WK7{Q}6T~IB3QB>IXu+AHAqVj4va=-)+ z{Is?Aw{rI6#Rw#jayYHL4-o)4t2-73Ml$@m%bqp zA^6%j4^ZNl;ZSD(!`FlyE6dn_u93vlbJbQuVbLyH zmM3(JM05apUQ2npUvy^0qt&!SD)lRbFt;K~@U_d*7zFpJC-Ksa7Ozv>pZH!(+M!ud z6L&py5XbwnyVCM8bAbeXw3xi!&}`8NL9vLUqMyr)axwzl#wN4|i3BBtvjYlzO|e4$ z$#5mB1AAll`!{-9Sm_A&lh&vcAjxPpk-6@xpI|apwG8&tf=KT}v42Re+e`;jnh6Z) zM9+HLtdTQj!G#5XjbgP>krj@`Kp7?y;;&)Ox`?JElS;M5-@mv^Q~c56p3B&xk~__S zi-~K^STTJFs?t;9$4>t)J3CvyhHM%jpQ4}ypwn#mYVoYLj~lcusPNnqb2=T^0ydfd zs)V7X6KzeE(755fLy2*S`MA>FC2LFt)84|GrR`uhh0N200m1D<*NU z7UveQ@A~&CP+PyZGa;5pMovJsnMntLDj=Rht&F0zpaanUdZLU?fRtz@;czLHFm zCP@eCwG>s=o+I*@zSYyo*Ig9FY49fnQw4LQfHe%Ur?EMQYqZ|Ml4i-_vC9$@Hh#_= zl?HzX`h;^T1pthz$r)a|B3L-FW0r0?1qb#FUYvLrR2`x{TKCnl;OBUE_8^mk4hh?BvlBNY0R(p(aQ z!|<)H)sVQw`Eim{Uj2)Y2$Q4DeF7A|dS&4Z4XlqGJ-WyBW`YQ83W&Uo7@Qk7N*Z07 z+J47DB*s9`e(ozk@hUKZ!`sBd*~zrIWnXMbsnYNRYgh8ba4_;6oIV>j^hVb|-w_+~ z?nXIOGDa`6Dj4xj^GkoDN$XsvL&4c%SIz!(tuJ3;sGJXH0d-2$AtwPb4$$J}Z9&FY z5FzDmK^2}1r}My^R!{|g2C9YzXW9nJiKsRehNCw$Lrt|D%*yE z2Dcf&z}2^4aL~bmI?q^q+YLn$FpMK%0_7XvNV^nFN!sJ26s;W z?~1`$0pooizO){b|4eSw)oP=|Q8)_C4G;-#DX%RSSrk zv49d*ty)5G;u6TNyY;koPrSD(I!M6E%7T#Y1+Crg#;_F9Axz;*18IyTWvjMQ%_Xhf zN`r+Z8M;fOThGy902aRLeBPIOMa@!|eb~{n$3?J%#G+}U$_dV%}z9Hl`oLg6nax!ltLW!LlBtfGX#NrX4=`6 zgY!T4iz1eV~+muY6^NFY3&kw_)E;hP3=Z9yHV;I*UsFTAia#ZYjo%g5+yiB2IsOm&Mc zCC9zu>j|C}gfpgM9x6xjP_?Z3DNQl=z}CZ~lKqAC4^FRrt;2Ob#?48zsBZl&*_~2^ zm~`wfePM-ma(OqTr+3=5$Xq!!vfGb(7iGbBJ_;V9TEw_L{rlb+3#(IL%7ik1JqJt# zo-*Zak7?(5Uo%C{p+Mxt%MxE#=F3ve%ywL^V3samnJkEnfws+A=UB&n!PL?fUfdbI zO8K71%8H(+K?rfKL!-IlF0P5Hi^Kd_K^KA+LMifSQT@N8KEVr!oaZl#n+V@quN%#9oUk;;F4CLKR{V{Qm@K@O1O3Td~M9NZjG^B(lPJ*HSAXGaD7GgG)l2R`Z&m( zadwrEnK=ZJ?CaBw@upzrj>dCiOzqW+!D)CXgWrfopnrJb{-2;MMd717<8Iw?Bq$lCZYu9qIe}< zZe+<0#5WfSpL*a-f*wv_M0{RVn((^4wmf%;lB^)7_QyZU?We^8j9Kd0!icCMTIZoIW%BzAFV)=Q*Rc*CDcqM72TUyJ`yPJQa z3l=ZGI=|*fIFu~;O>wKtc)I#_(9gVLyJSO}dj94Cv;^xFH+~T~;mf#pRzpH5^SyV{ zFM1(#ayG9Tyn6O&t%V{CD88GJ<4xuA7@w-}yi64Z4j$>WV)4&US#jx7B7x}vO#@|i9qP|o?=Aswiz1N(i!CRGE9bm# zf6$&b#fD;v!oEd(M7x#ba2`R#1bS#POb(XcF{Y|+=2Y2>-7t6&wBCx1|n|R7vbG(a8~bswrQUHB}%l3r$n9Bmof?fK+)v3 zra`tsd<{V6i`^cG|TtP z(Sco;9y{4L25hX$8ioe_8YzN|tS(y&%OAnXM<%WOREcil-CG6Jf{B zH|)vtt%8d-Nm`i>{ri_v1-;<7Yv+DQd(+nR3F_ImvSKwc7WIKjAmdfZt5!n7rw7%e z6M~|=BDuoi>eB4_5`b1xvq0?Ml@V^*1KiS7LtR(6_^$(Nyh;VqyK-51zTK>2l24+G zGM)f272<54DjVD;B~+&9BJJC75BibQ-{B9))AO6zGAsc1s$AVrW%=VTCF^=*=*j?P z*2+*~TD~<@tIy}eG6qpv;PZIH*vGFX;fVC+YO)z>1Q~X^sJ64}wHP=gyRPakwRN~e zv%v%sll`HU@RBV3?loPgl)3VA&bLL=-Q53_KgP$~wRWUk;fSbedE=Aq7NYgKVlF-Y zAK#u^ggxbl`mrf7=BJWMxclb8&QM}EAF{XHCgbp1nRcU~qG+lTY(yF@C4TP;G%}lo zxzhNPN(zMwdzk>{I}PzZ4Z5n;%-F%E^myFit18 zR`v7k2G5vbi^HUJtZkgf++t0cZfUkcLg(=oXrsk83B}1U)}Ozf;8*Ata!JGA9yAnH zmC&o>IVbDUYpU|2v%DnoYA;J(0Dxd=L3B~**YO!!x~z6}ojzNPpH**t+ps2nh_tSr z9QGvCsHeq62J=g50=Lvjo2tJ6lY0FHyE2{sctrc_ zr>hBV8y0%(^vecT0zXV1U?+yDrKnOUNPjj~$4@Vbl$8%gF`O+5DS3QrU`U!?od)*} zIhqrRdWFd^wQK(rsq5xnB-Turtjfx-0RZe(0Dl8~hAn6bJ<@!I7+NRAd4HLH%Q2Q5 z)c<+d823u<3yJ$Tj?GQYki$UG*bKO>Bssg;MyDS@Z?B0Xw>erT=@~q)xT{__vcUfw z=-f}Yrh~;m6f7i0+?9NaJc*~x)_ho8b2i;Nt==lj%dPTvZ4B6WnVuG*A|<83Aj8hC z5P4x0#}`}iK`+aYGfb_Nx+yp;A!o6|Hc<Xr+B#9)U?k1NO=(W=#^6EXx9eogJ zD{#5uW5B}zeXQr*8{~YMb;VdWq@Fq~D!d*~XWAvkEDHmmHZl8-_D&?WZlJvBQs2VO zWuX1}nJE64x=V#6QY?P2(zDiP$g5=u)ruZCq{nhDthy>C#-?(QM4c>jE1n^<8I?7H zzwg4mqBOo;Jm0y7T}DMX(A1P|iIgQqkUmtgnZQ%d(bRZNF|7Ku&sgkHhDYkOM9pPH z-AaR6y(`3;EchXvhPSpi8&RR95QlqA>I~(y*JRjt?@vE_a3&4BlKIiWppsvg$ARFw z`PZURWlN|?r^U4I7_Kd0mPYEjlB{BuTr(01uZEK-%c4wBt# z{fUiW)%mrk-{w1#^!ZXIe>_h^(oNAO=4)bOYx5OC^F9mhhyJP=STOlB>Ba%N?=$b| zN`*jY(?xI+E_C?bN1wp=C>h!}+SawWTtS%NoKO%AtE$GEg~Yg?#jmMCs)_S35FN) z7hADIOF7oC;)eGdRDS_j7e893XD#+Evn*Ewq;Zh^I<1dyKE=a$hK}+{^PzldV z;5oW~eADhhggtwF$&2ntxztJE&|z$w38u~a_cDYM;?xIw%m3#7pZGm9^>bnjtJJiQ zT#k1VTF}$@k#0dTwTSFIG4+`}+hW#L>7kf@bKqEdS&^zDO;d!|7xUbkfOTJQ zhmK8%eF)|E&n582YXEh0=8ojvHIW$Cy1@A6E{q%tU1>vTq=3p{WK50#G`@7zhuVwd z+4obt9_-+_SiT_^+m6^F&!LxL1BZlnpzIiY5!s%tk!5%%$haS%gvC zPa9;2Iz^oBXTny-@PFdIRn2-~At%eZCR9VyllZk!Z!<3N0p0cj4UTQI=Q-@?WU!bsrihL)Ve8(p3xu{PtsOsmY% zC*t-!i5uG+o#eTCv|`{!o93<;7|(D}3pdol5>h>^n2^Y%B%IzaOdHz|LPpqGd`liv z4d2Smh#7!0D7^L=-c0MzPN1oxV$NVnt!!$fCy*Cb3}(M?VlKW%bF=+{{paW8OU{7$ z3zEd{11)TI6RtQY^s_rSFna}&lb%-bc# zvn#`WL|`HkXMMAj165n+v32P=>QHoVzf?Y8Op#0R;p_Kr=^c@2Z9z8sAjcH%!*$0> zv-KiY>)D6w+TRsM?$UpNL}m3++Iglp#eo}MD%MAg>oAP^i41UsTy^u;rnydwl-4cfsb_Wi3mz2Zyg|%g6Ohe0+p9+L5dVzc%>GE6e-9_;N;nt2P7JYL3PrE^0ElOG(1( zm*VWJalgFcY3C8}#CNDKr_<{PDN#uv13g}b`QE-5ngNFYNN;IgB57U4>E>8B41wBQ zaJH_Hz6`9nFmNtyXVvCH+`6V6HRU)AujZl8vqlN|LJ=WM^|?PaRmmc=KcjBenc+e^ z4fG5h+aA*f{XK@8zBCCBACY>zW~0ER`9qbA(2*^914Le@MhO2w%3#nhR%lrp@~o9kJ<`v}DlYqf>Fd7wEvS=^s+w0zycp z>9H940?hwd(cohz3_4)C*676isx6#Nwt}!s7|_EeOdO)r(ii8S$P@l1d1hl~(Jx`* zGzryV5}oVv?`mTsW=stu5|!B4=B%U^b0-*%5$o%rLCzlk4w@E}-X7^YB)WEP?*dzT z*1=y4axdrnH9eO0fz6b~U92L=FxXr~EJn&NDL}H}$QP(6Frl+4Lio$|K1*bJp@Uvc zoYaKzmfP@Tvx$=z)&7c!(I8>X+o;wt9RRJzru@q5#v%daok6nmr_G)VgS6JPWyVeY z^-*Oj&^twS1)>^s9!XNO6u5_7FJerJs1Q~ERftuI#|cZZZ*Vk3h0y%3LQvni`biwt z!?huo@coRJPku%3fvm!UyO8T*`1ZF@pXskQXMTGvcEER9DR&4)>z2qc*>sm>%eJ$O zvVe9n?Wsxo1jo?my$Ej|d@|_VjbZ|CsXQJ@;_|Ns56gk}xy3cOVnktGfb;WVW^mz+?8iPYwMEEhJkYNJq3jL+@)n5UJvVKwB3#rPfwK3W0ANrhs zX9D`pvdBr}u;<8rrIx)0E`EBksWhi`#n);SU6yI+l_I_2 zCfe@dDY3KIYk^n*ML}QxAsy);?&F^K5fxM`#|YXnS(mV+hON(}JisSF2rV$kp$|5> zxV2|zT|1(tt)($0EoMZ-@pVDd?nZr56oWmr=`4ZdTC*$Fz9=U_^1(l>L@imE%}!0e zz80Zn5idDlNYjlW_~hqVet+ExkKO{2JIG)88c*&QdlL?~loBFC>gj#JPnSdL-idYV?wKy|$3 z8QIadxw6dHTCUe;R2}4*_sZ!%ud#6T+I!;<7xcwEG)r)pzG`63=tS)e6hE$;Ol}{l zES^1&e5W3lg9s~!Pg`qDNA_A5;-9`P(5kK+f$l*vI* z%cIm-hCz4>^;xcscV*;>^zUeDA;5=24UG3c1y^U99yh2gLg#>>N;B!yAUSY4_IF((pKB)6ZIGvgN0tr5Q@L zm`F@2G5i!C(Zn}a)}))2+oc0IIWI~%*pOr>f-v!Mbkyk+*{X_L!WIV~BmELP3#X43 zJ5CyNxv#bzk8l;0vvMwNc@2I>5}Z(a$-Qe6IQ+~~$&z(cCR<@A`gBO-OCa${mYz`i z-AF@vJ?H&|4)Fu(wc~*WN59^ttqLw{Q43M2T)w(@r+bON^(^69e6{hb9iKFST>{A%$q`N38GCz4UHkZzPmqXW|i(_~z3{~6EQ`31i644E#}jh zfn;6oqoMJ&<0#{*Wm2Z3JWi=pQShmPK5N6=uifg(3^!|-ph)f7y33k*+aa_3J3_!4 zNem)-K(q$4-9!g=Swv{Rx7@G%*hfUt*;>y0e&lB;&iuCu!mQlZPLZ&B7t$vg^%$XW z0ad*84XrFP%rNY#2ZnfZB^3L&7ZR-pDz?3ln2VA0%fnVzfCnUNHWIU%6<8SjAV)i~8-#Dy;+8)f9c94E^G>TEE}g5R z-LWem&FB1ki+|W#J-z5EFlAyv9>yx88TQO5*jg5;?&9ae&y#cK^MlYkpzgk`99b}% zmg##fd>L7(*QU3fTc>LmsGY6t2?o}+l<#@632@#M;GokSy?(n?mrvQHb3i*exLrtNJQO0(isoz5V*KRpgZ__(HUTz$x+hOTA% zvaPG`4v*F#(0F2=M4Yv1xX$MoL?9f4TvkF*0C25LeROUVG4Vy1`SpH7xa;zZ5<6G& zcB!=GnZ)}`I67|diE%%_R81o~3Y^-y&4tHu_i=SO)ee>ldIS=(ks|P!j8;coS&29+ zc>}txoB^Ter*0L*@O5UEFre!SRQ*P{fIi_GqQ!~Mnj3!0#$DBiy0zmzMXq$S!Qsqj z^Q1?l)6es6uov=s4JhmMyE7(4c1>i9(^K&O&tsR->F%ZR1dnpA{e9jrIOFKvnSOHG zXf>!eH*;xy45F-0ngCb{ESZjXGV^rVa3|Huv$d6y%fZq-I6Ltwav5X{NIp4z?`d(z zoirn4+;)$WWBV9r_PG;A=A0k^s--@6>>Y1Tn<%!4{Tjr4=Tcrc-Tl2|8N_{oz(T6n9;kzAs!T( zg!;2385q5Nz$tS`<=Uy+*2Tj- ztG@DdmC=dH;7!@)pTyxS{>5ArDvN13_a^Ai4e@e^@ws7NvtjgkTebV!RD5X>^u=Ja z2+T$XT?=(nR#ZRS$G{d7z4eQ(wmpoP(-+eRT+9ki8L3hFF4H4rHtGLG*+k)!=l4A`_qor^ znez_}uq@1L-mkiz*Yk132Ip)!ky585?KnAXG06)#qE3>d1a!_jt_ZM1bvwsstmMV? z=vh1L7BfRQ^))Z6Vgk;%zo3#EWgxxB*XxDOWWp){uEE^6VI)p2paGBXg6D4!%FKSI z6cwri5poPW*$oOE*cQh|DBKTw@07!{;^ry+KUD{1CpH)G3S!#k+XqMAj;?&PzOP6) zN?q9Bipr^Cl3`?qrt9xu+Ls`wL+;$o5f<{S9EKv?x-8Lg2{3XLzO3xUrl##0_=PYI zQ)}tVN|Byi;cBR}*?D6fOj5%O$I!%jc+$egE=8_5(oLJ$P5NbhEsGA3GEj+4H-AAh z)7|61@>t~CI;AoJ$!oPINQ}qsT#H*m`aJVoL+RXRTu;z!uy{$NjjYBZ>M&5mKk%UD zdnUy73L<^EtB-i!-fp#FHF3mKx2O*m;^C>VcUp@4`K8sc^V@*7d|YX1LFm@EL36JN zieOE-^vc5rM5B)DfwFm% zzLXFw7nbl+0Jl?GQ!+1iK)ZA9ALxSTnjB5(r~eP+?k@hHT)QwEW`_z}tCq>FIU1U#^V6b!b%tzCq;7dh;_f(`9~Y zHEsP!yT}YS^J=#1^EpkkAGI;tTA2Zz^&!dcoxE<|x_#q63n7RU!cK3;&v{Lty;Z@R zMjF#vzhijg4Zq_V|G?zR+-7=fZt(5y#c!m756SGvF?ShM@YOsV&TC`3*NmP6j(VPJ z@P$ubIF+TMdN#_;@^kZwLP1Z-#P~T1&K+FknUP`D2n26+HLv52El-gvV$@DI4VD-n zFD4f+NznL4AKw4`35=uk7YG-G1LTHW=al&V52&U}s(W42ASdVmYbAV`Ry@TX13l7e z2CC)01d$AhUxXm+Pmu}x=tICi=2x1zf=f~xX?@jwNUj(1IRiTwJ2ikI{>iQ>T>iw^l1P0vPpD%#qVN>sG6Vv|xr&O+ zjO-2oA*bPbuNrF}ov)u4gBLa@i<%cW!lT1*;&Po0CD!G(dQ0a-F#}Q^Up8rzg2!`q zA38a|tG5CmT@(y;Z!k^pOu){*3@c+>jqyIbaOuMr?#nt9lI_QVx&mS91S&hgF@1vY z+`T?ut-@K?@(uJy!D1Rw%2p_B^a)nXZ7sCk=X)v6`eU_%M-N6hPKu1A^kDE6a9_E^ zjbdcbJAlRn$n@r!vJ5sH8V}r~hj}RKP43PfI)wRRq~%Mt(U2?ud#dISq*f9^x*88k zU)w>C43f+Pl^%k;c3_X}$}d@$oaHFQ-Z?RRB*B6SV4LJQK2`NIzIr#~HqZ#C#FiUE zf@k-qI{Q^C2J)K{)RM;~r=JRX$~c%b7qbm0Bx*lIv_e~5XG8RZ2Db0~8zybL8(E9X ze@M}^$!RiR912G*KNoKnmOuq)=hQSMytUJd{CVdCskpn+qA+>q{$f`pL0CM?w1&ET zff_T8!EFeb^v{5_YO{(LxeCwLgwadx#%yITTajX-_XNAx^Kr`LCOhbYCykMT-);vO zatx)rM^xVM8 z`^bLCrR9%`QinIkN-K$Fyx$YjsAwwtAC*%z^0(ODBwc$u#xMJYjA(Turdg`C6y9># zfuSnkDJE5UaO|5>FUC3XZGziBBTa_gd-O*`DCV4RsEBu$@BX^9DR(?OQ2bx!(f@hw z{|{nQdCA?_x&83$15@oexcS@fh4jex5dAXpCDNI^2jT?(2=x)YpV_P*E^Tk)J}Cg2 zoQIat>VEeB2$qNOqSOIjaD=^>jG^ zFbaX*xI6GvdOwWpZLqK>=zdd=);691BejTGdr*GyI= zd$E6zV{NuU{!410OysEIPjLPP-nk2AKyZwq_8Cb7n~hiQnvl`9rAzdFSy zFAdkgQ?S0PhBLvU@$zhH(l$oz12bM3I+~ZsK|f22z~b>3;ppk3xf0Y0s5QzW#ZNz2 zrpY9$!#OWK?H)^Y_d-k)o7d0E_aBpXkc{q5{v=uGk3go-4YX)M6vo%tkT!@o|Lk;yL<$lzo;M5hk&3)&aQ`n1k5o_v^)enc)voK+?L@Os=t~=QAVS zPabX$D;~;W@5)xqIg4vY^{k{{P15NY=q+dZy={R1*b%^^xO3S{bok?GGCFJLyw^1+ z#U0?^q}e3@qryt}d1AVr10H{&H0k%LO6POX^izP_Wo%tV<08BDBJ25}?y3ynhORz1 z)5YDlh>799BE`(Mt9xT}*5Xb1O_e-Sh)_V|+aeQreDXA?)kJUJ1y)y`6!e)D$Z!BF zwL$;r6$bvEjDY!(d>If|baQMAKR17&P#`Y(+@mssZz!TyWjYmuq2$NI=x|$+k2#*- z$6v_^=)9V@=Uic^=_i-Fq{BVoqK? zD$Oe8(R=y{)XF2VkoM`=_qN5AJ_oi-l&%1YN!d7?Kvh$;;t5+MJ0~sb<<9Hhm~qN= zb1TpLGtyN3!$-c-H{>F=JtU^)+b4Fsfw+pO&cO9lmu(F@qCdlolN29Q*jWt0@!h43 zuKnf5mwc`c5PPe{sZK;;oY}E!hFUWk4)_LF5=}}kwB9Z5#(Z&U`m|?JjjR1z z2IDCg^pdC~!H-EEtS!opE|?7_;BvnMM9_l$Mk^$3jk=<*R-d-HnpXVyDD3QMesOiA zTm;_BJ^~GGOJ*V|10w3B6tw}hnQ~G!n{I1ezXr=bUSsoi6;qD$v(n<|%sbr+Uo5@a$1M_qKjdVu6Py5o+_QxHJS| zd+^xz$LmS?X}!_4;xH%f_Q8J*2ImEB1f|)Ai zpjZ_3QlRVGG8sC2EgqZSTyiRV%^YiN6z?rr)C8KhsQ7QHwaLfEcRwPF=BKGL0H?>3 z=FXQ4k~@FzyL%SLDhWBtmwufKU1|Up)98??>P?qM9lHq2X!B73{YfB<#}Ot|`@T3o zRf3}&lP7+V;ClG$&8ATAil|Nhacn>F_m=Yz}z z$g~$5AHvYIpLIqVe#ycl8j4t7NDG=dfYGP8Trp+Rn;j~*53~z;x#)qp(xP0fU5aGK zbGG)tE(jd1J`%aqD#mk+CpA0HU~w@Q!*2a8OlyTHo>LcO`^bom{`zP|EyP^Q;p3TmQY{7^n}kXv(~TjEMTb@mOW~r3F(ctz*XO!T?;%CSdEE(>sIz^nghA81 z6fd*b^snb~tQRL-vuRAbH>9^<%Wm1K-*;!bU&u(Ar7m%L+Fy{m)j-@mN&FV5*(M&}7|}EQt+wp?3A$&2Df>=1&}osmp>EZY%L_|Qb;GRn(&SxDY0aY4WQavqbN!PBcp1nHa3JUV z{+s##>=gK*t#UeX%LkX>=G(yH6$ReV^j$7RG9j}^vlL%d-gyL9owsh`z)W&ru_r4sP?7DlF7*P({jVFkz;e`cz6__Qu(Mr z;B?kOjKt5NLvQfcHO%{)bwa&pE%4Ee&=*98o_srRUCbN#`efB04u_S_T}kzr#f6B4 z?=OWd%Hydb`s*WJ5L^H|n4{=f>utSVlb`S>;F1+|JM&zKCuhj+Z}I?yHW4jp#MODpBHa9 zkla9yJPA7A0{z+w7%06c-1#cQx@f zt~t{k>&`(qw)R+^0%;5FQdm|ZoRNbF1v`{S0P~=l4$vA-rELNJ6IB&SyI|4Z zdzFy4#yga=egmbz<3ft&LHu;`^CI^T2B3I!}7CT0`z<#zgwB zbHB4BCWHhtNjw*hd#NeObQ`f}KjNp15KD4`KgE`tX^F*JNb&V=B2i8jE>Ye-S_b{-mZ2W>lY2-)$s}Bmy72ii|Q{P0W zG&SLkX0IQ$_n!@B&sI-0F0b(W`P!YD`MA%mE@d=wsx|UgaY}url{F}6b%1;EyG)+x{u2$OL*S)Yk_dwoCe*9_VRxfy%IUi}`)hIOK8=0l8KL zKiD70pzF_fALx&|cY*j;@(%+>*Yld5+gO3x<$iB#+C|7CD?SCPvj9gFM<)e*2mko0 zPwtvmnNBQ;B?T3}UeBKtTDpD{sB}6ia9I*E1Q_)z%_C8|hISSFPLwYjOP`S@7-*Pv zQs@~kAf8O?81;$T*?e-W#@PIz5lR4vT>?vPb<64J3r`VNyzkC zx3M1VYxcr6=kYSM_0_ZVp=NCGqV<%Z@g?EE6+RK;Q{*zjh}XKF@~b)SpKsDJVAxs7 z`tW@rbS|=sBJW+{cao033T-;24u&5uKA|GU$>--)pjQwV0iN8fXP*mW|x zael7;0M5yIY6%ZHDYi!SI;gIGn>e98>i{@(NNl}u=g2grqFwA%D-0?~C-z}49A84faY4vDHU$*&1lt>$1THXGT`_KNUycE7ZO46;0D(Xv2=Klaa@{}=P4Yh3CL}+ zn|%9fwb<@Rvp81f*KD9n&$U?gcsAjcFBN7J8FMYaiF}R_Z_Yjt z@QlbqHpBC^&$j^Z>7^p-2o z4}BHW*6tgh9Y>*#fvnWENx#JK*9#Nj)FNUFV)HLdIfgB6z;UbSM0@qDS2Vn#9 z!M|{mUIQKTX_aBh?6R{=Zl7mxph$2_=0ihCMCYgYrR0(?ZtRJ6YPq{jxdId zFAoEN5`8B986wmlAVP3<1CPeo$?b`p^6ny+v-|wO)8YiiFuI456kSV?*mnhScH01! zWI6Ps^y5T15TO;_A58c>A4jmxaeoNfkyT!7hS75+J#7+i7RXT)(#k}Sm-NITN0g)2 z?!|>00Lws)i_;bB&wrr(gk`|olL7&<80YUtMshA8_5VOW&mfbAYV;RE2*<*^(A71f zHj#~fFPx>$vG8NE>e3_eZo4nnyteBHoGzBOFIQUDS+GAxMt<>6&lqAqFiH&0q1{dx zNZfF^9)79X+_YU4rHm@`s#Mt{AQJ$OB_H@dL7NZ4XGj zn+I|`#&_C4;q`7K2VEtkS%WGJ{DgA)kKtw7=tr_eE_cK|A2;FoaTaOr>)F-w|A%-j zYc{IQuDhil&?NJF{BSF*d)u2Ym!<1iNbjoM{qq_%hbdM|0gp(~|K=$gg0ICwH->%4m|ce;_{kuI@7)GssQM zfL}KHbnU$M$oQfca&YKDh6F~J*a9Z=X(DD4 zS&*<&2_(>h+%J^_q0n6-zWM}w95vm|uz7t&j?|~0(RFJ6c+=-C3G}kyp)Rv)pv!o$ zqFKOCDEcgEMJ)Bq+|d(zvS*~l-dCvBR;YQsr%#r}C&_$%qoR&FoB^hB)(JSSUN-I7 zar~N2FrO~AeIge@0paYgHw-n?vd z^u|zMy6V{KIp1`X0?`7EL@Db%V_d3CW_fqI(;vj(!6>f<>}FTz%To^LsX41_p8HiD z+NQ4N9fj<4diHMtB?(m_LTM>sx%?_4alz%dlX+#?nx;pbZAk0!cE^43rH*b7=SNeP zkwV@-NtXUdV`&g4(v%tDW8f6D)46R|z$t2;9Y5C8`;jnfsGRZRRbfc%q~u0n?04C7 zxKEdiKk_c~qQK77wIw@q`PSpWAtqs1^&$MGxB_v1ulMr@>A7ubY(AH@fx4DPzt*Xs zE|aT;7AOFr^xi4{J#Rc>M|RcB&4o?f7++0~UG&}PFkw!Z+;1{GS1)ACPM5__ruU-f zKB+Y2%Z&YXSkS;X6I9dW78QN=BwA+;$1fA&7&v)Uoq#@fs@gPaRT=^o8+ozza5R%a zBka;1d^(Da?pxnGR#J#6#`R8`@iR!2(ARE7UDP{Vw`(nSd210>5&Khn=9clp&fd}_ z^=5|(p^`?ZvzBk>;a2Ts1iBsa(sCeYT@b~iue1a|z;w;Vy8d>{IkfkjxPmhCO5qD| zH;au}CvY0Ym+U*Gp~Q^b9VneKXI7egs~63zaB+p(i%vFGGBUZM9qN^tbnd&TfXspR zw|~wBe;9t?#>M`jsk#v4+*+h0FGeNZxU}H#+(E>^h^!@6TCyw#?|_v{(f`xu&!Tnz zJ#DNL$yo%Go!~C?pEqAx5*kpz|Sun8A?3Mt%l1-0TJq8HP^X&f_|i+~;G zc8owaIp{l#54BCu7H{I8l*)autI00Tg|Qb#p5jW|&yZh8A{^`QiWY%eK-X)O(aOU3 z?9rZxt`|Yz`C&$e(g^fgi=&##?rFKY=Vo>VvFi1kk9P`lC5bld>}TZ{^@)*2*WH#Y z?>X&v#%*>oUo|d`rAyNMDj1$ErK2psMd7L7k>}6zJ7sxs@>p~(2#UpSTX)^ZZ*MTB z2>ktAryBQtIu~mq*^_eBZ`0Cae5HEjA+-Ivt9MDKx$sl=-l|^+Nz*mr{ox_QfJ&98 zlaRJlOrhO!sD{c%=HyRFa-~o!(B^D%3}V}jHhaaIyAM9EAQO$SdCISe6$4_PG{O9g zqc%1++w_yy#mhNCzlvl0w}!@~X4+Q{xkv9`WhuckQyraXUho3pr)Uxnho9TbKKQRT z;OTlaJ9uv-1x5v0I=c9LD+50y>ib%T$;zPU-CLVm8?yEF+r1)p1PhqTwA9{(X@P>p zp44dnKQ5oy4|OwH8gUmYcj4W_B*ZW=#u>kcFIP9VsIX zmDRhI6INSs#6e{l(D!ta`&y>bii(;X<>Tzjih;A|9%27Lf@hs4f{Dux`tGJ3PkP=? zu){_uG!drK0;)=%G)PLcC3t*xsH=*_+8y8}vDAkHoExneW|9))y0rv4DjAd5qPEl2 z8*5s?p#j+Hn|^c#wRCBsTuleVmnw>Ik&- zufHuiCv;Zvn418i02CL+M7nN>(FFB&Z)Te)%cEVl-_BZzdcNdZT^v%AzEKzTzBdS? zt4>h}Vvo@C-c`!KSr-4aP4{K{(5khg>FaN|=Uxi9p*RZo&8hhAk*)H?f2Iqim)l$P zT~ps&VE43-*1{)vqwt`1M0TzNm=%)hOO%uzT3@>%{A)@2c-vu|<>CY=tyO*VRuSrE zq|g@&A#6pnt+E@dsb9xOpD1z5Z4RJX*a}BnNdpFl3Dx{F8qGqq(OCyt+%Aa|O+V{e zTz|l!Vs3`f&3+D972k9<2AJAa%!CS5BJ*KvULLqggrD8|uWY*q%!lD*Ffa1dx9n!& zdK}!J4edBpOQ(x8AA7-5@s}IA=C+mtCa8sPD}PRSqIzLz1dMLdreR0mj#Wy!;PD zg6Ic)n^JY1qk(@Q!zV7lmirutN#8gSxlu=J0!%>D3u@;fe*Ag0EgQ4gY?2x+W92_H zL^K35#=%|iXTWX-ZN@Y8Eq!u&S#uj^-#~V%Qp)f%Rl^5}#{Cr~(mm0U&uMwez2tzW zgrn(PxZIj$IbaW}^QK=v!r;=7LwqeGOB|1(7dkCPg_k!4k7HydX9$T(T5lBck6 z3Y1TGe$4V0NnG9KOw5-ysxy`|&t6}yu-9H1+^5b_JQDy(NVsQ7g`&fk-Xv-9 zA0+xW%!G>dXDQ(2pZ`kCTm8jkknl48i}zoox^3UDzskFxOT`&gwdewYb1C76;#G2G z9fsP5=O65z{8=BQlI}4~GhX!kYa^it2}`~N_B+M74EsaW{$!9c<#V=2Mg^2jK`r3i zQnx=2p;)m2pn|GJmNnZ~!c$QxLfypLCU2!0>jSjC{7bn++8U7fFj=tIs*j=$g@kq3VeX>- zt{O?`1!T(6#D3MgnYd$g0FEW?u~GT~#_KG-2o4?%Yzr!##2gswdMHA?YrbE?MVS|f zuf7CwY(^s8DR=)+EF>yK#kc7iHsUQu8A`(3;ec859+%5r1vCLi6B_48U#L9f9Q>Ds z_BQ*^G?wPMu9ItNk3OlE>HP@FEh?C>!LwRhoAAo{9Ca_#RGo{XS~gNx*Wnxfy|T_0 zmiTcyNUK9jh#3!)=(EIEvkizO27v0t+#Psu?XDy)8IGB=$?Jm6~fjl3Os4^1p-GwF?@e~Ecmof#!8eZ;y9x9^4k*B8GVdTGU(hM{)*+JOAtz9 z{+$m0K#YE^B2zNlR_3QO!<5g=&t+bT5)x`ujfm{dOJ8a$qu+%*MhpA{<%Z{!j=RnM z$v&&ebNU~E)c@rv{O=o6oOhw;T0B4DthNpcgYbGUY3fMXh~zc9^__YA*8TY`feWIk z$-K=$Dy_EO=d#2CRN1sbO#7ttvC-f(fGiBe+9^lLSrGcD@oq>n$O(3Jkh{5=N(2^>OUU_=Lyo!pgB)g)YW3SgnwPR z*P&ZC^&wjHCqm#juP3{~*%|g}BpdPWGuo}rjdDiCT^Wy!6i4`7N}=D{jsLK%LiTu6}NIJA{rQ9l(`!szqZ?^0;zkm;sd$wG% znH(+zuq3Fp>lWz_Au;}eG<`W*Z-^I1{Q`UZz?Z>~m7(ehs@H_7pCePw(QaZcQd~cf zispzwkqD7}N2S)j0^u1poSJ(@lp;@lB!z>38>;+<1jo75>bmCNN(4 za3~`+>9_ZCPvUmp!ab(tm74{NXW$1^a-+#=+S?UOruPyuzIJ|RuDwJMI#>X0qeTpW z?gu7+s?oy~LT2Oa7TNn^iYDion5?)&EB^qA!u&`fuH?L=zF-NdD3n_MM@mu5 z=xSVJk=#|iUV@k}wPs^U|QLMiP5l}W?vWNwif z_ZYj0;yjP?gt(BVElwh%#72nJRC@&?3sb5@>8DR}sZO8v{sTRa%&wGb5^APPC6S$7 zz&~oAa2}(9^x5z2m$MWi?@6@=9ch0XCCcOH$0{4X;7HOGqnP2=*bdGcaI{&oSh2Ev z{^Gm92TWVlog?Q!h1cS*m^Z7Vkj6vo!!NGu2|BqYBZGc|dWA6XKUB8Gc*q^;pomNL zTBXc<#}z&aJ~tp>PA52NIcFlSXLG&m$NxM(AUq)73LPbqB;ByPP^`xHZ&UCQjh%jD zCElZY;1SLBg~uX*t+QhQfSHm}qm!+nYpve;@rhE;Tbl|JXTjoP_Xb3qtlQj|A@8lnn{(x&n1!p^QW`0#7Hywx?+f1>h+&yP1=Sv05g-r+Z?u^`YpO!qY~ zFiVrV=M&qU|AY7hbhqdDFuiB)_{b)TEiBt7M(~6D*31p3wl=lAoTZOS)2Je6{$Szv zN#gtP`V(T-WYimg;XxthsACcQnwgXpEP4ubNN!KR6>8n3NIToHwf+0Ht-8^Pt4=2( z;jgm%`Ag8ZILV9;N<-JymS02zEHEX2?y0@(1BFr*+Zi%Cm$JEbPPM@@S!qSC;16}- z?5fpN-sbiZ*$TN&?~|PJu9={r9x8-9@%-6T>4YF0$v|^%-HZ&;WOKP%W!>^@a+XB9 z;V?&ASmcj5>70YCS6uiUhy@8gN==2J%Nv(JnSt^-C)%ti7!v>{rshb-)OiL3=*pZ z{&^P|@P;ODQeo;kEy9rd&Sbz% zt7~VsF*M(k5o@mF|08E5FQ)lJnLTcDm~hLwiU;R#+Y=m4JhI1eJHlpoa@82z!u>e3 z5;=ovO{{|^zVX7(>^&P3Gy*Dh?uX^rHOn>>3T2WrLs&jF0q341Wv*eF8e*H2-x`_5 zi=kZ;Eh~IQ)oU(HbQtDVtVh$r^3Dzp2h++lE~Ohs1s4LM$|IGRa1W;-6>y8d z+}B^=Qkg8}VH7YBm5!3Oo(EuH4$JSNS(kGf9~Q*Mx`_GbQkth~%jQ|+u1X(`Oo-t) zKESq+d?O@dZ)1f?9__06x&#O-nHxJ;g*em|DS+L`^d}KTd1rDk8SfS{YQM+9c850yP3axOq#QzL|>m0|7kX( z(EGrQTe$2j2|fwjdZ<909UDz*z|TY56~H8z{oThAn+G@&@Dt~|uKPFm?S+5DX&V(D z+9X&n_UAH5nm4IVwx=CDqh&8$^E8*=bk6VJ-Y__zVn#BBnMIslNz zlAL1`?yV-)EeUHuWy~`p%$t-zk+p=aLhx7w)c9sx&fHU|7CH;!aDrUp-1`x;M3**( zf3g$90`t%a%havX?c2$S4$^=*GA`35W~&P{V+$lQYHSL+5})NcNZ1OY&fi0!){1Fd z+xG6y4LK4qfIs~!XWJHB^ zTMFQ25c5cNYGIK%bR1Yk+ja=t;>k&;!MvUi|Le!FSouuo|h}a#(sl-7F#9Ane|AzmQYf?=X(A@HcsJ4 zS<*>(NHZ;<{T%%*VL``UdrLQsmlRVW0seLj#!7eMb1%Qz^^Bl7a@G%~ z?3f$4mB1sx;GTV$ru*EJgtW}+YVpFu_LpBrm$6Y%E(4tjk{=rBw~)R*$&vBHSZ~pv zS;I@>gf-2SEP8{y#Zy zc-y)wZg$;HR+{Dvt)ZMZM%OEg6lZClc-~_q+UoEpX}~5J6@2j>u=qr;G}ZYem6WMR zILkR-^R5Uf5~Mn{tq6%ENA{D!M*TZMG>Rmls%pJoF<6T{1%>pJmtSb9r1MzVam1bG zNW4pQ#{Mk4vUvx9On6tqPs6J(p$m@Lhbu7tfjZ<<6BciF6~VA+yYJJ*AvR_Q8q~?L zUy?uIM$9@qCcPCy(6@*2pbuW^={r;tg)RZ*Kq0H$+rTw z8&=e9wkgiBdD0eEI5M`4{OaU?ZfXBrya1WRoy<#C9%wgn>>Rn$c6P`)3H&n-Gb=xD zq2Ckh+`t zD}e11zevAn_Q$L|CH7AlU#V7yX8q2eDb&&8ECmUg72NLeJscW;zdHLeLry2?M^e#e z@P8n)UEoT5J%0TjAiaZK!TSKOtijLternSE!SPN69SxvAv>^BJsp!2LK;a?_6wvw! zRk+NaT3kFKQxbNJfJ7o<*08u8>vUxmJA`5togICJIhtJSrO5O??vd##lz*jKYlUar zrHgW(_+{8|Jd1_J76iTNCw@xzu`1AKZ`XdiGs;rx9(4p1W;8 zXq)Ikr%=s#*)8!x=7{Gt_Sqg}le#^?@yqqu%6q5FyyXSJV~`o=W@&e!I~uoOhI}4Q zDSgu_yl8nkBZW_FH$(Ljl>f2*#yIEtkW;B^0y1U&Sf0lIuRbkXB$>1xz*zv5F=sO; zO@7#ozf(Kk*+A^t&AM|z( zdp>SC?%oEdC9lq-8{H@FSI)g2fF=8&5*RXQf$`bN#)K3~>(}n}#D^ne#4AF#?e+0p zw(bt(h>P#h|zmYNV-B`7@=0q(3s@8fK^CB`lx%mfDb$M>1 zp3k2T%TVK&aFs86jJgLe35wO2h3N;B&;JR9t5Ri^+hExp4Sb~`5GM2L|Gh|?*<3I3 zwoWj1d5v0`D_AskWktsqe}}F{X;e*KDj_(ZQ1qFHGy|sGPiz@25R#*=y9>@^-U+YX z3O**Z@9)zI_(tTm^Nu)V8kwnYKWMayc$|X0QTgc6bx7=YnDMaNou5=o?4EK=%cCTL z3kxOw_JIagc(;p)+yuqq#fhz8;v{?gUJe?jAOw)VDW~aDlq$Zu9_ejWd(#;y1s9Jv^>WcGA!;lEW~zl0vr@b_fD|JB%PSR{8QKd?y-`zg->F3O zrR8M4VZLOCLZOYJ+{dPJe^n*Q0rw*V8;)e^AYn`v=XsLVrZA94(QJHkXtRDJKzBA^ z2I2!Sx z7=>83>WF82<@T!ZuKl{&Rr$qmdx%3Y-7aOv6=ry!%_tL`jk6VGYFr9@v+8pjwj;bB@A11YS0Yo@17Y-)Y$49 zqc$2aD#|DPOrz=r^WE2Uuw&Y!w)@=xv+me0Dmv}uH&&u zS9424o08Uao)+25@;~2z&Su#(hRc=NEd4rR?V9Tet*aC~WK*4B0BOrZYcQHMZ4~IE zD#&iGVB`Y#0(f}Nw2E0>U8aNVd@ZWVXYn8}j}_jVsy~PB%e!YzI}V?hH0^A#+;cVm ztC?!`56?R`2KNthzo?7kfMq-r)k%c#`4R|6ZCDRw#*|ImZ`^QKQ7%jCxb9$sq#`z#(ws6>o{au9k--c zR>HUx)C8t6zmZvLS_^C7wwm|O6(&YGEqG>CA6#Gm8I^T&o{c{+FNHNfdV|X$pZ`@{ z12dA~_zYemLfzOl)8>^jfqt`?1x86d&^j8QVDAI|7%xa42aJRN_m$M_)2(3$77UByhC$)S8snn2nJ%?0~XZS$oV) zW+YPgaGUq@GvHZBwn^=+C{;4&6Yq19CXI8}F8IVRVxU+Uj@upq)KtK)Rp-_T zL0bDIfdBW6h8P%>uFwBK1>gtG9CY*5$^ZE)H~+U~q!SJG2O_d$AomsE2Zueh$AIAx zqHv*IzseU$_^`Gp!b_|a41Z_5LHViXbXk+(Wp?UqtYbS%O66IYcw5AFJX!}C2c_-5 z@a$?^zIocAxVYTjMCS2k!zPyv33{|WSwB9#`ezQ0Q|?m#W1faa2F5RqMCBd%J-*wU zGwVDwr->WVI?t2$h6Jbe{B+mthw*B_cAGeo6N|?Cw!CZC2SMAXtyG-IqC_-AV>QoN zzPp(7|FQ{6H-7Om>cekFYSx6}HRlV6XiVbHF2;f0QMsFRhTjYBHMpy%wK9lPU`tmx#rIzdp)Au$auD=k4KUCmmc#^nPP3W!fd8>iezGS3N^jAVqg^m zFJE))9mp|65ucdEOJaZX*uWqa6=pyd+!>&-SE)Op<4&8N)0Df_QA}Lk2CFwqaM%25 zj)9ta&HC%Ey`H0`(%rK7yMn}^{4By)Y3~Q|fw``Iw}<4MNy*WM0PzejF2}!WX$ez> zq%=>QB?t2+B=uwEw)Hb}DpIZD`m3A`H8SSeDv4lc$NSzCdZ7CQM8iyq_t0360!#MJEBK>>zIR`czJH{(rb9DEiw>N zT3%+O1F$;goD1_jmd=hB@dHi{xC5BD9Hkf%cNjs_sY}2?`#;k;N5KB6-v(spQ~cPC zth|HLN{jn+VPhsqR_w7imWTeFt7BZ4M|mfum6F}qkU`3vR(9_}@r_s+O( z-0wx9);#Eh=?t?;HnZ%@Hq3wzAs2g5?%P@6zD^{raHd29FH2(@40n!R|BBDq_tYDN z{WZ}pvyj}?yd~uG=H?6qj^#^mZ$o=^eV87!+84KTy^W7@Y(_l}SpsA5?GJTlzNBYzc3Ws=EhMwY8&krdeaJ}cI;qs&@CA@ar5(H ziTGvWMK!&}mu#;Up%hz`E&oDpHX&y#sv?ue3hr3t)#ABNqATk7}N90wZ z^t7S~8!0oTYT~5Fe?F475UNu1*ZsF?G|CFOQW)H3t(f;sM3o+;AZ*T*V)S1!eb|Gm~?pr-i@R(qt<+!ls{JI37B6UI-%F z^{`(+$<>6lapcVl6Sm~?n1%tU^N}FmaXZhv>3eK%6KOkV7^sRc4QFDafaFMQ3MwtK z#rk_KDu=@h8^_&iUWfMXC;XkyYYO4DlWw!)(7fIeeL)$3FV^7YxtdqXt1I$8Q77Bz z!@)ENbKGz@+jd)yhr5|zX8&(;&+F4X-&#`adYLWrK_YQOA_S_g?qs@0@X&H&h$_Cs zAWA~%Gckg>fL3C={5bT@Y*fG`uSbAo6+~nu=jC4Taz*aon!@o19IBtgstM+FrwE>(%>b1{8Hk z-6-aD99|Ax)7kFO>7?&0Ky@7!%SyR%1vo!U)moTw*y#TM*n6v>xPotA7!4j0H0TiA z2?R-S*We89?vMb1V1on*I=BXR5AF~G!CiwxaQA^3VDjz%dAL>Qes!zv^R4s1%PweU zy7%f{z1B}u*&SwAN(LLxHLHw@zk0AQeBDZItVzS*TL@{SZ=6&*`+9G63E9TKZCaz5 z&9bw$xq73dqSqR;ls(?Q9_~QqP&a)xzLmU6m6%H|T2^&aH_s%}Xm5ZcTOSKx3*d#B zXv`0tqoT@=#7zukKgFpXBP(*FRX=$o&5G!8J7+N$Hk}R=CrB^Zm6o({&cStaxnu5r z3@QYm1>9aPmWr#LWV*JW)8szgEzNyF&`hgGATM0Ao3ip92(WV;skJTM#BF1vhngs&zHY8l*SE&n*jk5sa`(43Z{5#Sd$ST`uX zlp(4qwY6;;X34d_QoI_v8ggPFQo3cFyEy0tYl2BMCG#GzJ{TQapXQ7#`8CuEl?XIY zN%*_04$J}?Xtl$Z6WVV32Q0t$0Bl7>)!?puYI8`1;@E$3;czAsb@4g<4HK8N=B(Ic zATvm?md|tH{>qp6hTUG0pAM=ytEW35K`#M?@7 zVK1aaWxJbW&G?_ziq#zXh-YoFy}7))drpkC!)kEV>D2K(N6LZ?xggyDH zZzg0|0=d{8)irkC%ne*&fF8Pj&-~%>LVkUvh>3M8lL1OSa?5FeY*&gAGW4|P-!3VZ zdubZjCC`pC)zoakgxs}LuTcPBSc{f|~EniYi+zg1|=mU)v zTM7BfASE5nar+yz=`?}^bKSkM_vp~l`lmt7cg6mPNOjmd&vwd}|FP-V;Qp#?ZZ@}G zY|i{TYevRI#+ZOJGc1Vg2TYC&lP$ClboA6EBIz;Ec4#AA1$KR@z8F4V7H|Db@Ltg}T*{i0Jgwb~>@fuBC%I|=h=mW;NuOg=!*40Cx33l_83~hEx z@H3pkTlA7`=^Wf3Y|W1@659}an54g~TaMFoj7Y@@u>P6NOQJeY>vT4p|8 zM!^Gpj>0pYwADhtFFRhL;n%IE;dr>^za}A4;m%uq!T}I8mPX8ZX3SSWNABvNS#w`) zJ(Th*hFFqL(2IPCvcWeSa{)G{DnjZ2vF!IhF@S4q1n^TiS+r>${}xGj<%NqSuI+@7 zv?VCkRK)C(_3+d@MEkW0vM(jkG`kJR-G$#;)8_@Qe|_G)ku_O)m$P(Y+OfLilGNQC zZVK?N?gWWylsV%-Y?8-ZTqgV@RElO(LnD`}#C*c_WLh%qE(;<}u?tIW%S;0sd?X34 zbog@UfVT~U@`aPkOuBU{g;gdw8((IK=(l5w(@5Y=H-pE1>-~EvGFT=|?7s&Hb(B`F zj!JdH#$7G8!RkFj8dgF&fAlLIISpl$Fu8cG4#EZM9|i*Y&gzDVSH}fXZ(CP>jycd+ z#`6r3#Ry=bmNod+ZBMnmAN>?3tmKB*O6?a0u_!$$U7G3eg#5}8S2k~6({;_-hRUmO z@x8Y$8+DsjFDDUb8qCx)UnFa3b_qQEUMY&i^N`j z08vCjIeMOZy}Qv!tBSOz6p1+OcomH_=Sf==U2=9xS>z?UH~PVQtaYX{<5DN9)-y5{ z4+h4!?dVckFQY;}_Roqbr3$Hf+qilDgfK1S`xi0bC69pg zg}n`_)+%M>7XWX;y4wNZ`iVerFGzW{y>J5PkyB-NHX4BXr(KTp2VsxH+?ZjaG(Raf zpueGAfPzhR&+cmg%>ZxD2LyW*v@dcms(G^3vfE)fzgM2HE=$e1PgYxvF-><3#rs#` z&Nj?i?d%3e7jsJlr%GW^Cd#(UCK~}8;g+Ltsln#m-3NW`e!dP3fR_9i=KFfj<>=b^ zkC4*?UC0ruL2^PFdd%!3^wI2jb&bhdo6ydz>(fSh^`xulHCLb!hw0W4dxdo@=1l?M zX-(o-PNG>MhwoSxRhEY)5~h~c zhSKp5#SQszd~V{K?P(&_MyC%k%R?AL)bDG1zIYXk^bn)YeQ`XreDWA5Slo@+euB$0^@q zCzs~m*QlTGm-VO6OxL^+9xsgPZ8!QnVySF0=VUxzuIP|;shw@Z1X?<%$~Zv?nq5wZ zwJk*@$kUnzJmY>E-p%r=@(WSQB*dq{bW&r-Mh1{Rtv${J^1EyZYq+vM4RUg7{SlQj zk(DizxJm#L%JevbpDa)(h9v{2-&8`HhpVKdE9B3$s7;!IS(`*0>Q5ENrpz=Cb;@ zh95q7*P+q|JUnJtd2}dK;b6snBqJ}#>Ft=Na9p2`Nn_>9M0bWW4 zqwV5Ku!Vy}y$QFjmBfc^!{4^sBlSj_!u}3gb?)l3iU=S!PG|DUFy*l11(C~Fw;ev= zFV6Q2t3D#LvtXMyB)YDTYuY2T^SlY);mq-AcJYTE6$TVLx7D$eJ4WjZ(HBvk%niG1 zCF2eRWu(2E>|z8cwW`F{6*~bQ;0c4sIWlQtMRA2Wo{!_-oZ?*0YECtj$`97L+DC}> zPccg`QPva+gjwex$~5lYN|SFcaobKlPF%9)~Ni^?Sy=lFU)V3!Y6 z2YOfJ)Vy;jfZpvsD5tY{$4Zmw=yLg?-oj=xbH3xIfQ!Y{?>{14Ye3sMTVu{@5kFnx zs()$fx~)6KY)auO=G{Z!>StiLlC7Y-&;C!rxN1(83GwEs1 z)qkDfme)moTDt6{Y_~Oh%-WUpBYee4<=9BTWkl&FWKaXuLDydcg--)_k@Ontp~Tl0 zT6yuwjqAyP`6!7)T^$Rqiorim(O$;z{8$}K*?5zF;Mk;ilinCf|HMOwQ`Ps0%H9I8 z(ki_YFP*m;2)_RYidOU4RnS^L_VaFauR{83Otu04T z)Jk%%;gPwf&Wi%pAi5s{WhAGxo{U`jbBXJQPddY+FztF5K{cj?A#PXKrC`)Bk%`(l zTNYLMQudHgQ&4jDWZbFvMRiqSNz6%L&aYu3OfLT3k8XwuLvxqf+Kq{*)GJ4uZTWDIOZ$J#aG5N+3ru+@?mdwq~zttWsuOh*Zz(3E%+YfN;rr2 zklGwYWMvlif^f3RVNYIIbM7=4T&--;f*Gxnt7>bP;aQT;3$W#GY?Vs>Z2yw9ho4rg^7#lAJj(rIG6= z6$;34-n6mXFSDTVJ1-)Pi2{zk(AOpIttsUQzqz`e+*K39Zu`tjicsKSjZ>S2Up&0+ zD`emHuv>@0_|Z{N|nLA)X$l$x>u-W&!i1oM{Cr0(rCw9m0mKEsXjG-Sa5T zd9$F2n^ULM=BDM!_;onNwgH_4-M2sgp~UBq9u{P_ITq3@85ztLdkH3{Qf4XPf6d!O z??pfzDaWIU-g)Vt>j_ZMNS380s;jPLDCv)aK76bsv&@f#f}hN$9`c)P=yGU;U3*Ek z=A`7n3FU<=>Fi3M1m3f^>mOb=#-j=Z8Y=?`W+@6VpYSYyfdb>Q5>8i0ZR2dcQBmSZ zuO{m76|G&#oak>&R9j0FTI)p`>YU~SV?yJJw+~3g7LbL^2S?rx*O*?j*uGf4CKEaD z^d^A-7t!DppjtP4ID+txby8RvxE0$!FbG#so~rA0ODm(zv75{fTx^ta4EcNAeS*)7 zt$pMl3BLe|N0U2rnL2%0NGp@P{qkWzxjtDD!(9Q&|8B%`bIJ5AngOR2n5n0>Av-Uu ziA7$z4C|Cs>{*N5;-^4oC6Eo4oS%r+d`FO0KmJEJbKJW=kq(TRv1k@9vf5!Gc1$>V z>#t!?*(#qLG0d9Gh8NFJ4=Gyt62!!~SW}j>hMM>W>N$g_X%e$>P)sdj)M|_2h?S*P zw4hwmC?0DP9W2sv07I>DAb#wwBTIy7C@dV~g|9hVu2^nWRml#0qh(@p^n#d0LQ?F^ z0KP&i#P){^!ig3jc!!x2Cy1Z{tHpe zxT*>m%&`Ri^=0}+^omj)jBVK)l@a&$jQP8mFXuXEtTirgUdzeBq=mOJSJURuXiTN! z375{Fu?9^glH2rUgkhhy9K+PeMU7fWEv=kdvN?<^?~r-$h3izGsO8Z!`{X-JI^GEf zWB1y9WsF9R^i(ix zi?s5~38+dl-}}frML&#~IexKQ4)j?S95pi8TD~7KRBrxEz0J6HRY%~Idr4a zvwohXnmzw(sVb^&n!>55uD6WTqR5U0ts|+@;Z35Z_Kb~1M!CJ@kf=^{g>ps4vg5Z- z``!S$AWJ93D((g5_3MbFfF{_Yn^H+=!YO!dB5_-DMs(QR|8W3&>v)cQENhTI*a2VU zq*4EvjkNMTa~_I43I+iST~v-3gJbgC#Z*E*glaXZJ|ew4x|B6`_c--xD(2Pb!)GrveuBe zso}_qvc78o{VELqq=qFEn`;wRsE`2&u|SK(*OOQLKy4M4dS!i!K_tTrN>s<#KVy}L zfAyDpOwJgT_#vNPAipGVJv|{=MXR;i0||l&_s73+ zQVf-9N^uF0P}S>-5Zph8T-@zh$jGe0Za*g&Kt5zb0c)+%a*5W;qH^INa!`s@5gM19 zro=JS%aDw~l;*7*i-xGg@ORILMz#wQ3TW$y2IoypF+1vIUB^W&u_CsD0oL9k#zWN8 zB5ct4j@;VMz)EK|iC4KGCiY4^VqDz;PJP3^8|Rc|xmu99h2KoX9iiF(C7g6XqIbHf z?=(9_Q-Q{oEF5RkkJm-Bq5roe>rqjs^CGZM2LxO#=6(^%fD?Nqxo)`pQK*Py#b7`L z#6rI!!N-iS$_JW(CGKW8>6WO2a_B(#cVVsH-|~YPKWbv6TF3o3Jqkbd4L9A-!7NCpzKt|BdPZBs+2MlAPwKm-YRElv=PQ`<$ z`w2hiE^E|B3;f!eYwR3#nx4z&=m26?>1jIZG_gg&Cj@{m0+5%g2Z-(d;I73qyZ)o%k$Aphq7Z$Utw4aXCm>s@tS%^N0O>uW=2Pb*$P(O0bxiRW570BN zbCEMz65)bBudTM^_68%Oncf)3p}!_MBxTB|w@QLbucW#N440@bNFksH?+(=Eup<8s zvY?>a&~B@RXa6_8)c=kQ`fu!!|6)}AKkyrdF#sR0tY`d@j5YxRvvXB>Y4H!`-A#82 zN`!EFfQtp>OUvE6?K2(_96&rQpCh`L0cw86KNLo1`rp^12PzBxkaS zCD)KcRATlpFZ@F>ei)}9plS(wd*mCVJZ~@W-vyAvJlAzNzsAd?cGW!AX;hl0&f)AB zg$61#x+F;TJ(*pa_ypmUpOqr&kgg??coiJz#aBX*m!*? z%V_tm6j5%*9fr$g)5WUMinohjHH1t2;HyEVRcVEsMbabtJRERQ9cM=u#UV%AGfj+{ z2sp591HQm78d8~*>UIW(eoJEb^5o;NTyQGfKd>jyOQKKCy)?VJsSyWQM=Xe*G-U*_ zSK?9CBAAPgtsE88Q(z=c37=Dfc7z)hll9}^LarNJnD^Ues4{XQtU3qn!<~@!Flag~ zEHprj?5Oi6$W#uT@8;n1S#XW<^0c-~@c#BfXFIG=|h0kH4l^&eQ_5T^Jdy`k`(o~jZ7lS(MUJzqX|tS<}M(Mv=cfo z>O@H2ED3XvR_^8zTG%4!(6V5RF>x$E9R*sX??l#MbUfJT5y-F;AbPnwACFtM4cH8) zsVUbw$j7VY?FKiXVdGbH7wgZ_N?;Jy)-M!mPhVo9AAfY+%WOX>PEp_@$Ka6l4Ol4cI{LUBmEI*FJ7?qvK0{`ANd)P$ zN}_Pd8C9-tpdv0ftU@gDjbdURG<{NWCG-8j={#36Mx?&^Fsr2)dtK;$zaDKDN%i65 zwupFVr;(fMsqqW1q(T1ch20~feb_McF*W;}4Dg<54>mb8t&|mGDj@1i%Q(e)d-8KX z#gPishLPi52qbj2UQ9lxA&EVF90^o9tL2lhoZqI4C*?I~b@*6>)#`awF8BAB=Y-I+hdO^^2KFk@_Sk-{@@2+j*h||9-Fgmx{0&X$&4$s zaWVyo__CPQXP+)I!y=>*Nu`g3UAwRN9Z|J4kEg?0nmSwXeO+C?&TrS$NNn3wPO0m4 z@?G(V8fqWWt1GWXwqUd}fJaw}Q~?I;>{<+z!CTPxg~3(aa0^}B!W26p9SZ0NuIH$r zZMW1H_7bLa2NOL^WXNi3)AaZ$wS02_p8;L!&H|L&>-D%R|`q(?G%FM{6C7UTqZCG5B>zBWnzBpyWQ z`kF-GunXft>?1J&Cn`P(R5>eTad*f_pxVkW6jIy%g8@Cl6mOvGvm=g8N3bOdN_m~T z!omXi_7OJLk;`dLvM+5NJUhecQyzNtqJ~wG<7*lB2q4+f?b7q)I{vKSx{KCNT*o;#GBOR*^r*$!s;O zWp`1;AHBaNGr!CQ)y7wS##8ii#}-`dFSFDMlgpjE%z}2=O z4ZpOH=0$ro*U3Af_g3{2J$DU*G+MCo+#DL}5Z2$DW1jc86YCo(C!T69Tn8%3iseXV zJ&W)_`k+L2)IkN0doC^YN00gzlV{3hoNspM1YFdmVg?m>*6^R>hG!}}I)0EB)PJE| z$Nn@BZxg>UVA=64RY|<`Q>#`Uij*@Z#Y~nV2s zN^^7ZWGrHBjF8c1VA+9Wz`N z+u%11Nsvbsf9Z}`Z}6Aa6$%Hru!9*)WcJ~fl>ED zg978$F++*e$Jp1c@i}(m!ws~mtEz!g;I86WkBONGXSRzNlPU$;X1RPou1-b&q zsd@yAh2ThniDnb%u``CTl-f~;V9j<@&wOso@D1a2d7&3KJTv$K;zGnJyt>=h$?p~I zuM7w%t;&8*5=by@lV#|% zSg=^;9YSGoG$7N0^Y65qeK|F!&P+_MEX;;+ln0w%>>C=^WObTYan1j zZ`&4xh8ampC{>TcdXT2g`1?O(P!U&q=1U2!5kWuUqT(FsOl;Y5jejPbWf$ zZ+{{$Ee!q7O?8!N6WhK|Cj6|5k=C&L`k9C%X%!S8|C*}wPM4%xCV^X5A! zOKB#24qltKG{ZG$?k zKDkY8tyLuEzd1Pf4>VH3q=C-CRy_fpb zrxb@dgKhVhZ!chvVmF{2M?%V|GgM>zP+hKcFK{CKv8!1zp?D`gmmOw(m$`lRg-Ua<9MS!ybI<=chPos1=GN1w*0POY)izXtDF(?D~HMv`|m^da;f zNjnnaF>YrTbzetCD;OQ8^jP-QUn5;BM?an=rB@ESQi^Ft^;bC9vQO)bWqjGY#T650 z*H-5jrqEqh1Q;-WRLd(=J~M0gQ2`;jTaSpiGuPjvD#8olrTdBgoejHFWN_s&c9x2? z{#a2y?dI0oS2-ma+X;t82A6Z(UF@p|j0uxR4F9`6bZ1megvqlEyjy9?%?GB^Ke42fRu)mvET3iyjO{}%~2K-`@pR;e?Kh_i1By;y{6>94zN+gGEs3(PVL0UWr zm)r`!A#r?Lje`8P4bZFIufaC=M)Q-zs9N1_3-{_T8NKX3 zZAYDATrzX^p%XW?;luEJiWeKMe<>UsOIb9eb0pD&{a)DFZ4XROQh22bYbM7_UFBOse{LUp_S^SL@6z z$$44a;eU%|wC1&xsg)H!&3QZ%={j3Fy?eJh?%~Zk?ee)F2mG@_jsq6?@+Uj+vBN`a zHN<4QH?M56>y^4)OevE9PaAKB>SrZ7q%%i;KiEDbNNG^)gi2m_I^bWvxgIXgmP~{u4Mn#_ojf9Muy}t~1g*kG1iR<);#- zB0TPcKe1Ay0&f7Y1aAyXTS8r)O5KC~jEB1N?ckINKe?q^iFF;VUhDboLk0-f^1!OK{XjsNgV zPT*P53;%DTQnU(%Nd;;PvC26DXt@n}SwDQCRBe_ICmM#-k&8Q$%^^iA#>#~u^=r=W z@vM-2>w117cX4Zic+sk%S;d#leR4{Z{oOiAL)({^wII{N9G4v`lllK(g}F9e%_+<7 z8EK^>w#2_ek_r-%dUrm0d}&7$;rzm)bro1HJLtE-5E76AuC-b0TIqe;ThORqP`^y4n6L zQ;t_qn)-Nu*D9O{md8z&u(c!^t(Twa0i(I>8~EkDoGyY%iLV)ACA0pRPI-)h&!u&i zZWzRZK06nKxJg~g`qbcQ-Tf=^y;1xX@6($+G7paf%Ebe90Pr(JeLMc(#&ps`)x9gs z&Ys9FA3*qrutZ%}aK+{9{0nKySBnz*qJ47FZ38byYAEYx?$B9Y3~x zaQV=fazmN`v}~K+)EUrcvY@6ULvO$B7=r@dM(OXxGDY^u|H_NQ@cKHfLVZ~@)oP!v z^DwwtLZ2-dto2~ZNmMP&@afhml2 zj{f-M+S}ow&VM%b=j!$=0sr;LvQ?Y_g{A-SPcTYD9d2G7%J-{t?(^>}-7fx3qejMy z9k(Z=Brjy!a}-=r2w(R%5RvMTS&|TO`)y%a?jcF#(pQc2EN=t%PpYR?XqdIXxKYdR zjN1J03EfUqt!pkFaP6ewmLM09bz;(q#LB4$n=zzshx2bjx^vf+CaDj{v%=EoKEc+= zTLiBX99t4r1^N*mZ;9{qH0jfZk4_1D6k5t{q zkXeb*jq8wWzt*T67T8$FwAcSgtz zBrx80@?6-)V$UWuEDM=QYY9AnL14X$JzIao0jk&}#molc`FSq#&-&9plxOGd8#j|z zcaNK$0EG$()Cp1c8#ivIuE`(w0nSwObKuGI-YXWQ&qV4!lqqk2fbBSNcYZGv0F(_& zAZb1OnEOvH0E+@ktOR%vk>0Z}mizR>>-_#RVS>c(W+i}+N^!5=L z@g0xEX-_TW=lfHkCw@^t$@KjR;O`Y$3;F-e;RBLj!>i{oclR9L`vm|*KKUV0CmnhY z^Y?h*lR%l%nZ^%E6S|}Rc$v)wC<&bbHL=s!^Ns&~;*U2jp8EkCiz*>6WWrD4!5nyS z0-}fP#~ivnVR-{g8E3b^e<-2eYiwgyOeCeoV{8 z|0Fcy69@{$?Bcj3tkrFwb|{I^3_Q)<&$uSE+H|V-;cmU(0)sKp=d}kDm!7h<@rE*6 z6IdTYqNKw&B!B)12)KEh)RnOV?9?AaX5Cl4Ny3V7m6dSg2}>$JlRiTA9a^u+cAe}v zFQjmi+2~&M1KodjhiRcBvwN+cNdm+?1J~RJQMoLsz#Hh+199u-XZ=^KOzaQqRS}H2 z7ZOkp==*?~r>5O$^67KGl_NQ^Yr_QX91h!7pi?8IW_XA0yY8~?lw|~do&LEhH2fWf z(W4mQ4CGg^xJ{9>UR5_A94#8X!B0<#G1>q!OK1C>5CsGi-wu1|ywZLHc))a&Wd1|x z0kFc&fnQI@9)duB`poKj4!BzZ`YtXeJcF?eR4vYn9rG==)D~76Pe#WFy&pRfs79vl zukQeZD04Wh390Hx9K;8jT~bBpnA)!@jlG%ajs*_B8+(}9brxKr&A}$K(&C2m6J2bw zwoBYExtW7kM+P18dhNM~XG|LbjelU}iSJy`MkpUuDYjs;!a}M?hsi<_pc9E3auv6G zZ}r5`<9c6FGu57rrXE*rXE)ce{YNpNnx^#`3ReWC!dD%!IN#&Hx_`6%6oCvmsPs=l z`T>gAh)@^XYZ3M8K!L@%ZHLqf(#ezc>Bz5C zkP#luw#RB=l-`U#1)XlSf78kk)*hiO_276`&UCZ!hG8$d66H}LR*Co^Rzb(?#ziqt zwhMyZdl`^=fxirp3)@rP|#( za|IdDVAfI~23;lC|J0&X<5HdSZL?ws#HJcnrQ-@Or-i2p9UrswzGH+&7KiM<$)s>!LbHh+Hu|B+l_oZ zeU||$m$aS>i;iodt4(|kD#UJ0=OdCzSfNhFhKqL`SCgwic4D$OWo&Yu^|wg^A6CJE zTpn)6aShx#Pt}vgcHvT<`d$P`Bd{q*5hy&e*TN&Ds}$7y`4}C*ST%nAv4-CQoW*5h z@diud6zY;8p9mek@23N@SdeWpv!MX2)0=~EGw&~n!v9br^%qBP_8yNB8x4ykO8-!{ z^g(0F^dnuo7mX<P&~9yjq>pTaB!uTFouNONpMXY7c+1DX1V(rE-_ zY$UK4$i(k42uu^8PWd9gi=ST8(WmONJQcM)NEp=s!{AOKtr(+k27g&VY9Fm?ZXR>E z+!A((u;%9|t{hyoE=#(cMh`ie3#Ouko8f zCU^|PX-R{-x(jnZOMK+9|1Gg2GnNb_tD4Gk*niQ3=_j z${e5Cu4s4K`s#VB?X%+;*mZWBA}MGIkVENh6r9r5UI93|AA7DZeAcM`xE#Bau{<+sI`J#O(Y^dQDo)$G`y~s@gFhRFEWu*XVZB zIIuh8N89SM*Xhg(wy+dg)ncXQcGKMg*8Vu2TbS@JPsb$dxkvJ93&G60E-gjWr&#Ct zgEa4b)sX=%-HVk5#2d)fyMyL&V2* zYwKxdm!yIrAbYoY|4^EE?z=P8-S0{$nwp+9-WvmQ4rcc?*#H0{OzQF8zHf9+;>C;l zP>UZASu=NARCVQ zS+@=FTi`(1(u9bTn;^2b5Gk#cFqThe}XRZ_Wgr4!ZBbt2WR-Qx*RFs^a`-mo-3O(X0z+H zPcu&~j-U;ZO<=!#-c^z*4{ z@$z8lz@zF9;Y!rbiwHUq!iS7Um+R2aZfh6p-Am0}EK8XlD%*S?7>SP5smo7G8#`N0 z?bo3^re+^_I*D24I@L>mUV7SJY=x&>W`VtQqgD9@@XtGY{d%(0tD~5B9nmE%OnjXT z8z3mfY#$c7bQ_08J$Jt14s7X5lsQP^2$Der|-I>ocKUq&1_IUS^wM$d6&3YPNjkLn-D2wy|s}55`)Ga!qWj*);PbU4oJiYY+F1BB01@;5O(W(LAI%YCAW zsPs2i)BYa&v9-+HNo<{DZqBuMVZkNl_otJ+26(5+8+(aSoyfpHEOmDccQEVf@NN;8 zC$BqcN8maa2j_165hsV&o^%fmq&!F$Bg6GYtYbfq$vLy7z$x{pFlg@cI9r-7GU^?3 zo#Uwxb?z_=7N$_*^1xtZ&&>L60C3$`{+i8y161|k2)cA#nPb?^Z{6I+iQw9*ASIL> z&(uqGZ=LYL zb2X|H1taF&bFLe-Ye&8M)X2=u+|tG6_w`E7dVtjQ&Cy2^($d^}NUnAPc|D)RPEeYO ztiun@KwS|al%O+rFf(Qmz~43}8GjaZaw|-ud~Cxi#;{oAuIL8-6*PfGCYp2u*c*RW zDz7!P&`=nyT3NYkey*_w&S1m_ndY5Rv3?>Uq|-9soE*FtzNY=jUUl{G{N?yOzN(oYu z7xPx-WtNH-IqzO5t2$rH;Yi<+qdXDT8weh7Grc8{G8*|VZYJ!ByW%bGSl=As{4_xE zSEEFV{lF1d2bXNJn0E@R8K14shSF8?_xFw};lNK7tdCAS=J%5QZUW4wEbuRt-vF_?nwWoPSHzX~$N)6}J zgkmXrRp#O(4ccwT!~1y5-OBikSNRUnYJmLQtqKECdw0ox?(yxNCQ+z{FtNc^>YxQ~ zpOXb;9yO^n^bgjDq`i7lq0f~8T(;O$8s@0v)UgbjZGSgTpY9WVlBU1=*~CaJt+1Sc zb`Ps7nXJ51rTep$t(i9wuJ0MHWtjxyWK=ugt%uJUU9D?BQ6I2p@hz@jOE&u!uLG2UEAvjzK~ z;1U5q(DAf*u=Ys2^zgJjQ>*o;=}7eIJ<2m(+dBH+&bY?`r zZb^oIyVYvUyN~_$dhX-oD|hpR1>CMSOy#hQ@D5s!(N#)h5ZDZwOieubRrxD3BW6!v z`2PCn1$w3S&~0!9w%gp8NgoFu8vjN};S6pZDz(v?{tm*+^oN*?e(5o4MyezV%aI|S z0^aRrbf9`Wuw@<3UmY>b=V6eyc}=N<@=OvU$_z+04kvqbzv|WEgL1XlD6Za8`YJ9P zNa{A)pmv3X=x5_n9Z4+S={gh7CzHFdviqiKFcy8WsQ4ziiPt~4(Cnnx*>ZSmdN<>O zY-u-#-)v!u=xeq+`$zG<%)d$;Q!Yb8pe5vmq;8r)OA*Lh?Hys~7WuosET%SoAYePj zaegi%7F_EqH?hse%IXN>iYcltt*RL0GF93tEKZe=q?G?+)yVdGj$Fgi0X&y0bf6(-%%w=jNY?h1T&#V70K6YD4o& ze)U{LIg+Oq*yJZt`akE(iT)i0F3iu@TKw|WeXuO}_Ko;%>p`lvw7w2;f1;CyXpp!y za-u%kZI|ZPqhV7&s!Oj{LQ=7&6vkUnOoA3#ndy5mRHJ;NQYyU;Z%hvtm((jMW)+_^ z>S_W4E=)?&l)8I%-*#w2<*3S2`!GfMWyNv`ys`8LV`}YthYzY-Z>Oje)rrb_z9GJc z!D)-8TL)VPQs1oh^K3^((*dLwTFx`Mm;ND?{1IbijEj11=TQcZ-rNUEr9RVt?=bWq zpG{v*iLaXMe^u|`ZxT_07vKUrXl|ALuZ)Q1UQz9Mq^eC~Eo2R;JZ>dqWDG zX3PQ_(DN)Pl6A9RV84=T6yxk;4~ay_MO!oNdS22%I|y}Bdj zHA{kz?l&ZM5_Z%Y|4_;TO$f3LV*71BkIg4(i!M<+Z%R+#Gg}AES<%+V zC5gzPkbL>hC50hvGbanKQ~Ro}N{4BWkdkU>{#K8!AgyS+nNP0Iv(6vV77fxN;3FlTzFnG^V9gC6nY}dA$WPGWL&ZWtBw&-JK6{8@D!c z^SV}pk>wIw2X2(<+X6qqTfdTz;vPzUf%~vW;;i&?_5xX;b1kq)y zR3MMm*vuAkv*4mHXg+__Z8ASv!|s=$`+pBm2IE9fxu)WcL4uz9vR(a@7$%U7&) z^KZAL1mJo|j;lk0`L-{wShtk}Ct??7?{7Y7_(;}a_hJyY|+Gxn=Y$utI*LG?KbO>=aS?9m3 zDxQ2UVF&L-XcMHjFf(c3IOa~4h%S&h`Zu517d=S)eSmU_wBZnGZ8@;SsZ$pRJiC}x zpoq^}ihTC-fw!rRs5md5$x0JecgT1_lK5G>C{^N|p+IkmD$``Nm4hQW6qAcdKma9% z=B3rPuD+L_anA_6gj-6S-U zz#Xzy&TeBErLyx8jIQbUS%+CML#j10`+0E#1(7rg!tYA|H|Hcv0tIOApsj|HH}6>l z36PB42l$e|@$1fv#!4MI6ON?MugnD*5JlKece0$7#)50v;z}eBRM=_A7)=M4s++zm zC!(vOg%(t{q$^RxPE_qr<%CwaB^cGx=oi*jY##@MxrkNuqVlktaPau&8kfL)Ix3nU z5Lpwigv%4s+2#T=mRyNX8&+0blK9DahvI5l*^eBn-d)hQ)h^9^sWxwyjXUX#DVj>n z$GF^5zpwK2X|8!l^YPkchH%gouO{ElD_Rs6hbK{)-pmMRM$(78d@gp(*{6X@5%w!O zH$d>=hsQbZLuj2DpoI0?%g=!|w)oT_hrUqe|D)}%qS}1ls9hANMGB>OacFTU6e|US zI|O%kDGo(L3Y1cyxD_Y_4+M92w^9i1?(P!uTls%$?>+Vy>v)}JaDY9}d%yFZ^O`N} z=uv-kb#O4l6*Qm#V`CTLvV_?W`h7oxF%VE)CH%`ZTYuz-mh1N3j^$!N30o#5Q}`B>fhadLygW zlJNsG~=3_kB8S%B)Gu{(A5$#Z(S@ zIa!%oF)gNIGw#7@f2pLr=ta5n6tmx#U-IYqeup`+qUFM&t%Ls7cz7XQI2$pi+|J10 z>|J{2_KjU4SKbYstiAbB-#(>xQdi0kV1;lIjcb}+b=}(C&-O7rgZ}CZY#c->Kx$Cd z8`F~-&rFFn8Dq>*)iEUAeD}pTHTcViZIMmX!WHG@fOe!@qQscai6tH5*ztg026%;m zAy--=VMbe{W!|e_X$RBXSZX>nb0hz4ZMYM?Hlw#hw8-$Fx=-4>ndIQmsZZ6cp=;m3 z65EW$XgDa(6luL2HX8G&;6&xZ<)JJ?M{B85AV0s!@Zt8SM@Q+rK9Jv?m1BWE<}C>F z@#>&Nky^gYKaN*9XkwzsB>4;NJUgp~s1mu0cm2%XW6N^sCin^c3dKv~cxmj3D|{Q_w^Zh<;#lswt{>k2 z!crr6t#;@-?{ku)7i}LwS1G23BI~Wk_4WSp7uV6Ezj+$F8KMCfRvb~3iH_JaBy!t0 zECzvHy#5_0T84sie3vwWGJ1*g)N^F-0UHuFL9E*W8O<`;%*)oXaQ771o1*+h-1w~| zBb&#)T(ACtlh@wY5Pinf;WS|XvZqz>iF9h}2v z`5UCW6@`5m*wLDrJAS-VqCw$ip5e5v$%NY3`TS%IY<3HhS#k$m)b>H#&Cz}w8mgxk@|6p{n z3^Yc#9S8o+KDzP+7#c2k5iZuDCJ#dS8WHk|T?M>rmHNxur5dpl%a^9XCXTm0|IMNP zP)xy}tOCQRAKEzJR;{?SYDE!DU24(z6Lmf2(5uxiwaoi#YUd3oQG zR#2H!_G?g6O$@ASyUkw{KQf{$N<5+*uUbwpX(F2>y^)7{i^dR5W6a?EnVfcHOm$p4ona;Qs2W~N+|5gMA|)Ur674=pSVAxHuWl#wyVkZ;$%Ife$W zHMr_8G^$(ea{qnH9Xo=X;lE>%&`(0BdOC=PCIRo#i5C@E5K>!97X~$2%zr(oxGNn_ zWwVS_8D@!fD30P+V!hmSz}3T_7FSTJVv`5HubMe+*_VVBQ`Mo@5kAS^S+}%UTmsn71pA$Flt3HBD?jZM@@XMEEto0E>kxD|M>a; z-~XV1=Q?g^KG%7Emi|zIv@HZl_gMctUtSQn3O+!|pZ;dexzC$cok!xR42JpBz_m$W z1VMePl~4Vwk?4r0M5XWd6zM-s|Dm}OT}wQ@8P;FLIeUHe3c3@PgoNFUWj4tyjin2k z!5{_aXAxt24p1ECS4PEH@Asov{iVD5*xV|QBv7fS>@&T`LAR{88V>q^l#fW){0?Bf zvvFWCWXsU_R%a@^(@j1~tK)OHzWfwkC2Sk>KtqxJfCkcy!uxoLP789#5SicDBUbQ# z-~Mwyh&5`;OOqCTq~ZeCDRM|@aKX@x&2LQ17q7!doNPbQr=b#JX{yzD?jDo32ci=# zMc)sn-{(Y@DK^=nD>k8Yt-(XkR;7d_V@f}Jku+ciss3HByn+QqOX~qOvR+5O&6a@1 zP4nK+ZMnUTprd8WkuW8Nq-J{E$Bv8?%VFfdG~%Jq7r3CnS_VnJ-@9`2Vyz8?PMx8O zpUZoYJ*cN1*(49@7v?I|+JqQ$d6H!D(Ke^sauV}mM5p^ii$3**MQen5o9%U6juy8Y zlzG+WDS1?IB%4F>8FDxd3O1ETlnw4PT1UQ^7(zY3M7Q$!IjAh{c#y?eF?IVSn1?Q0 zyzd(TTA+Rj>e_Fl8n18R@ST59!(55ZL&VXH=Uszk{_=z>ap-YPI`J|+qiCo^ehwJ} zxNd1x)srwDRHkI~ja}yQ2BomMY4Y-|epufAZV`^tneBM+3mlf?ZKHytr&628&NcUp zDZMsefUWcR#;O6OE6>jz03G$ZSP@7tfH7?H=YFU}7zuuL1;*b<884A{aL%{RIzg+Qx(`LEQcg^rq-e+&FV zvC{q_CPwpPpl2s^%4HuR{lJd-%qAtvbrfOl$ z8@dZUq+H^uFIld*>T9rFr@g6N^;*9}@O-WD0V6=m2cwJysi7oydB+|bM*RGvybsaJA1Cp1HEaW1p1yf==R?7wJoXW&; z>1(f0;WD|gOB3XuGDU%5F;RlX)5QpiceJM5+5%l%Q;Ie*IRtdwc*_(QB@E#-_$I~+ z6{}mmvF23D$>MEZae&65Y%$SytAu~oHdL^pR9+7x)9>{=;SzW!oCKxFNlXup=q~B< z%TK}lnPbvl`U4}q{bpycA@`NFs~UB&rXzkAM&}#11P{;c94nPJu>+IEN*1_7IyPIQ zqqJl#E<2iUNJf+bd2;5aVNs;Ad5d7B=DkpW@EyBSwS1SO+YP;0VBH(d3|Z!GHNbc~OlcAWeXkGqJ#o0+=T*c|NJAfko;CFIsb335B<-x7VJ-+rQm;J^n~{rLRKeXD_b~ zC6|6=dPL#*BkoaU2JllM#zW_1_#t(rtxo$icbn~rJMRz>crFjf-Fk$JG^psIav{Yf!sT*A~ZmQJChYG8~^ z^1Tp0Gc!9pudgVy--K8qbsf^(+2~@xnPd{B{cIv?IaP*6TZFnRJ0U77^(AHKF}5*M z_+|4+v~~C09A(r9b44-pCF3j{#dpBby`uxf+P5xn68u>v*Y10khiYdbvt(4m zMn>-pl?B&#O zp9y;Q_vf--_All(N90i5s?pAl?Y}=D=C6W5-y1!#Y$J#+!C{CM8khTc4Dbw+F1a;< zSG`v~(X|iB1CvNYovd#}Vo#ili;2IciEhAvGzHIBi}1X`<}f_yHCKp=;NX#qvNzh1 z1@7DC*3uwv$*CQA5A?=pIrAPvTG@>aU?Fwq;l!R<{6y3>m2UCO z`z&rMt=FVz86uKh=LRN_TzD|rEknr^#|yy3p7}lO`ZwGA4pSl7DB9omZBSzz%|Q0` z2pnW6ZgFOqt9V{UfrdWtu@j=skWWY5IWxHP?_d%@_td!EZ~>`op(wwjcXZ=W<(A)u zEj>A9d@9OWO7^)QGc|MVFg#>;WV`UNxgw2kyBwwFsz-4@b6)8Gen_(1aelY#AMF)2 z)z>6>>Zs57n<0m#TGv|gWnR+G)TpsaW+R_bpG|;X7@SNZxl;2fv#|B^R-^sttL#(L za-Nanm_HvNtK#LF3B9&3KFDALlGS@7FO9XahAK#4LO*02u2v)(;rFYB1ELf#1VstrST&M2Ase<9o}-cisSuqry(g7Y?c?9S>WfCW5Zwbt zXJqX|z6>brlPe#*j^{)rgR;oHqr)|=zKEbwA722MT)UbFAmL{dakbA1h(w__4UmA} z^$F!cBBl9=Ny6YHRV1bo11IQ(mIA%Db08a~nK&hszP3a&MmE*wbu?@_Gfo43y+gQs z^-$kFcX_xY#Q>)T{=&A9WVdLhV>?M+y}1665636l_y-+<5N~WByNmf^ju*`T z05fLm#%qyZPI}(!H-*8hQld|91@p@$EQ^`_PJOzdY=4|E0O62n&oeP?|!10@HIV} zt;L~w-n$4{X}y$v6GpyKvZ1>SG<1|ETmz;d7j%be=m-5qb3;DyT0^c!Pz~c}&8;SG zt1Y!K!8jq*(}E~)Q*=S5&*LcBV8NDU{J34lNf9>QT~?Ap|tm;+DK5`o=*hQ^(O>^CqBy1+#*VS*M($6Nwty5+2Ty0Dj@jR=IX>- z%8LB^Zh^^P80y#xL}n2!z+aThSg@3b0Hs2emn`-K9a0_+{|JSwhY@e?Z$Y-ldrhCe zNw*pe5S0u){38gN%r`nACkQg$Ul{zGk658zEn2!>qIYtwJS`Lwjo<={*oEp~+*}l_b>td+o!%rGW zuiQ~DAaZNuZZIBZsA993QfUWc_&TDk<4x6-ScmoIR+jmKbidy8ov1bAPuI-=tbdl~ z4eG0s*Ob(|(%fEu#Y>*tJ|fxV6R@=OOZ06lK-p|Qp2T37hz?+7b24m5!=_JeDwJ4H zjyS)T@6ZY8QYl4Q94h=_T>oc(vk-8}i>WTk$AHbv`qnb(e2 z9?jpWqk9`@M%xY>-vliW9_=Viwc`0yFF|1nq0CrRi8oE8U|Ur>adc?x_FP57rb-0=rg2FwT_9DNpD+j#6G?J+*8*D=5%%UM$?e>srD8DOsuFvfF_*EB#sq3wPw zKg)@zpCK2z`|oJ$-YD>^Xb@o@pvI%vbc?)^n^*S(Ix~V7pYGW`{E0YnbB3&7WBl^t z40EJpO^@?3Ecs6!2_EBX{?^MbHX1}f)9Fw~rP@iu#=w_Tk~iV!APMuThwG!Jf*k1h zDV{_0KmEC}zxR*j_|YZ)Ivje|umbX;fO!`-qi@#!FJ5wx;5J&!6!CkuIGO{-f;vn^ zE~b>Q9e`<%P5OJ&+z~WT58X{F<^Jr!QMyQGzWbWr`-G-@`ny!rFEW+HNYb#@7S+ar zqege34|Km8>LotOQ(7Vh0@`>Z+KD8<&b4;J1Ro~%`0gJEe*6&5E@0|~{gBcyw2UeW z@I{BKz^d2hpJMI^Cv@^enDg10%6sGRz+ojHooml6_?u5GJ^*^3L~iVse63HO<6@wL z8|=^+$3NUM>T&N}Oua*_LSS}S0moj=OWK?S7 za@4wcab)iVzqrvVTaWkhu4pSTd5SX+;np~3ZMdrN!+X@pwt(hU*ZFtM#@U~kca$Gu zqgMm%bTr%?_Z_;@SbVWdtkaZA&hgR&Zr;2g?y<;LmRC~J%$;}VJ)V6VM>6h%36+yT z5is;${d7HP<4jlh?RG==i%!3KGp~F5R`zl{wy=_N>@THmq-|-B>lb;L=37N7`~t>w z$`2H1PW30pOtYTjzJ!Yk#RG)9{e#H)9X^MFYB0gKvBAYE%W+D`n+R?mhyf)75GJp@onZ;@OlqADEDpkdd^g(e`io%mfBf zdUo8jdfwbL9MztFG&URT-ufynAzMO*`)@j^<=vXllK9kO;O8bx4ELb9U81yy0D%?Z z%fI;!@{U)Z?cbz8vn-8<9bF>7ee_=fR~D?&c&< zN0zV9V17nc7Kd|YNZ%S337;WsYRov9}aQzpKF7qd?aoPBTH%% zEjg5?rauh@FUz7v6Q?27>sooic|hJe61}r&HrTvVD4@gjpFD!{3@?Yf?HNcFL6ygS{jXo) zrn5#=v|0g6BI`iN;2oQCW;iQ~zn>oEPQtrg#`fm!xqXnNUP zy*24@x6AznYOV@CP*80y;}I5A5&|$Qr+8mQR41wD6mr$zG}S?(P0Z)hQv6%N+v8KT zbCw+rg;?Z9w<1>rBKE`IiuY^Xm%cPQ8*=mJ7&1Ejikiy*`49_mlijNdNMdiWfiOl! z9-g->e9tAWXG@yf44fYt$-8?5iC>p4(t{d^+_{;mJDQAxE#;^;t)v77auLcPg?YzW zfR{eY>KE!tmm{7@?TkCt95;UUU4C4;P=mJvJEX+er)puQ%~kMgj^Nb0crMJM{Jmay z@uOzBOxUuYHfo9?dKbw#WKpKrQNg3|Z{Fa_t+H{`LQXzF|H~NhwDofoYPnsY6`}On z(BOfT7+p=qpry7N{mX1eDQZGZQ(@#-1`PLk=ZYX$H8GD-h0PBE-e)w4vO!giv2v_Z z82wxwiG@GOou6GwpX2J(VOz4HFh7(qIrAjyp!{!y<%inGS7etD(~qdKI&B)Se_M0U zr2?XS{)x7Q8gEWfZw<-Xp;%uDeGHkLz4`~QcaaxytLCkLC;#$|w;e|{wDpmu*wQ9y zK~=wb;LiQLlrUAHfljDblEs|QI7)KfPoF>Fd9dJR|FYr5HsRCNR8E>2`FYU-wwq%% zV7MO(=oH#p`*gPw;k#2l0)hn9IPh)>Fd(>}SzHMK-MhHjEEGa_8uznP5kJqF5gl1y zHQdqcr_p9{GTG@GEx;;a$h+gTxCQuTL4e()vHsX)`MdFC zfmE)I#wGvv#)m6bI**BsYivvs4KFbO@cen2bcsCSla2G%W@1Rp#CN)BY*MkM_`2aXUJ)9F$$1UEDtWevgB0sWiOXfHZ1xsS38~ z81YM!;cRdD>NLFJiK0&CugQ)Z*+eTv{2h&0ptt%*7uN+GJIdxJ^XLzKK@1Zgj?N(M z_CT}$PwA=8|44>L^56$&6w7J<55xzx1&(V$($3U=)xWcUrnwhe<*t0*M&cvvpYDX? z^dBJ2Px6gN7hwBU2UIbSH~os)iYw|r9@!Mk8d58Wy7;fDeHCVB8`}}(!lq$5gO5u|MqKS)M z!w-DBJvw8@c4V<&3Xc6VrF*8@Ad%PZ?3`SgM&IbcHzB>y(xTB_^gb^;oAJOg=sV*O zkzL0b&D`ld#4~E=>#BZCRAvdYqnHAX){8LKDE*6SZ@GIP@{=R__Wh?m&$QY+!j8?A zMmon7AMOJ6l3XI(Y^}=mQg_MMD^1_wdgNYlNNo@yEsIjhT6?px3H}4j<3T+0S3x`# zWgk;s$%4Os9{X#Jxnhv&OKPd9kFVBFrB0%HN`1##uO>2*QzuFHNVV-5DRabkp(5)a zW{=LsPrd%0SdTmre4Wp0^Y#4DRc`9KiBnXdiH(ipsHG<%3FabPsA@pU_Sz<#=dUZ5a9ehd82YsDvf24lZWg^RvuKsPmLf_nQF&bz(`*4Ch z<2fSWEID~6XPkw(>5%n8={Lc>5wj=yIYNQs$CumMv#jbXi6iH#E93+n+~YI0O7S+g zbJ>QTu15tnD~9wX0}B;_1AbKD-FH(vR7Zr=Mf3v*HQdwA)IFylQ&EL8ogRP2EIUL0 zLv!zJ69s&4W4{CRfjfSSn|thb#Gy^PO@nqiYyU&@f!xe(mzudF+d;UIV%7Hmxh;5) zi)b6L^hZk*ToPJx^cuADGz~7N7abq|4{aK_O3j^@Ht@KH(ZR+FjJQq;5#}7ze%nPK}S;~AIF(OXXOJjs9ww*{m5`DeuWSns!QscGIi}OtMeIlpRghI%s|6V zx5h52YJ|CpUCkh0u!C86X>c1}I?y=vkvF+xXE4JbnCky0Fln83(6zDUywmsS9GOR& z);o7IS}NZzdd&mVS1cFp`Rn?06sx;?YQJN53m-IX^k}ZX0Q)&yNMzeb^qnKa>y9Q% z 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 literal 0 HcmV?d00001 diff --git a/images/square-logos/isotoma.png b/images/square-logos/isotoma.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ac23d9059dc6abeeca18420ea3b7ddb94faf85 GIT binary patch literal 12751 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 R%YS~ckQP@Es}wN`{9klL1quKF literal 0 HcmV?d00001 diff --git a/images/square-logos/objectcomputing.png b/images/square-logos/objectcomputing.png new file mode 100644 index 0000000000000000000000000000000000000000..622e6b98a6f0d9bea8b09db18616638eb77db082 GIT binary patch literal 12237 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 literal 0 HcmV?d00001 diff --git a/images/square-logos/redzara.png b/images/square-logos/redzara.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa3b9bbbe4d1bbe346b189477abff3d934b90af GIT binary patch literal 20191 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 Fe*ij2K#BkW literal 0 HcmV?d00001 diff --git a/images/square-logos/servian.png b/images/square-logos/servian.png new file mode 100644 index 0000000000000000000000000000000000000000..aeaaa58a213768eda578272925cd92715a71bd85 GIT binary patch literal 8466 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 HhKl+>Y1FlU literal 0 HcmV?d00001 diff --git a/index.html b/index.html index a3f73aaac3..cf22d1e40c 100644 --- a/index.html +++ b/index.html @@ -64,7 +64,7 @@ cid: home

-
Attend KubeCon in Austin, TX on December 6-8, 2017 + Attend KubeCon in Austin, TX on December 6-8, 2017
diff --git a/partners/index.html b/partners/index.html index 271dcd0b25..14f39332d0 100644 --- a/partners/index.html +++ b/partners/index.html @@ -22,8 +22,8 @@ cid: partners

Kubernetes Certified Service Providers (KCSP)

-

The KCSP program is a vetted tier of service providers who have deep experience helping enterprises successfully adopt Kubernetes. KCSP partners offer Kubernetes support, consulting, professional services and training for organizations embarking on their Kubernetes journey.

-

Interested in becoming a KCSP? Learn more.

+

The KCSP program is a vetted tier of service providers who have deep experience helping enterprises successfully adopt Kubernetes. KCSP partners offer Kubernetes support, consulting, professional services and training for organizations embarking on their Kubernetes journey. Learn more about the program here.

+

Interested in becoming a KCSP? Please fill out this form.

@@ -35,13 +35,13 @@ cid: partners

Technology Partners

Technology partners offer integrations and plugins that add features to Kubernetes applications.

-

Interested in becoming a Technology Partner? Please fill out this form.

+

Interested in becoming a Technology Partner? Please fill out this form.

Service Partners

Service Partners offer consulting or management services to help companies implement and use Kubernetes in commercial applications.

-

Interested in becoming a Service Provider? Please fill out this form

+

Interested in becoming a Service Provider? Please fill out this form.

@@ -53,4 +53,4 @@ cid: partners \ No newline at end of file + From 114346c609784d40f676cb97ad0dc63cff7f063c Mon Sep 17 00:00:00 2001 From: Melanie Albrecht Date: Fri, 24 Nov 2017 11:37:49 +1100 Subject: [PATCH 24/45] Add requirement to use US English Added a new section "Language", with only one sentence in it. --- docs/home/contribute/style-guide.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/home/contribute/style-guide.md b/docs/home/contribute/style-guide.md index 4b5efb30bd..db330d32ab 100644 --- a/docs/home/contribute/style-guide.md +++ b/docs/home/contribute/style-guide.md @@ -18,6 +18,12 @@ docs, follow the instructions on **Note:** Kubernetes documentation uses [GitHub Flavored Markdown](https://github.github.com/gfm/). {: .note} + +## Language + +Kubernetes documentation uses US English. + + ## Documentation formatting standards ### Use camel case for API objects From d58f785de1dd675993089c24b29cf0f546f92024 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 24 Nov 2017 10:13:36 +1100 Subject: [PATCH 25/45] bump the version to the latest available from docker --- docs/setup/independent/install-kubeadm.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/setup/independent/install-kubeadm.md b/docs/setup/independent/install-kubeadm.md index 3a4c1536c2..0d26f3f6a3 100644 --- a/docs/setup/independent/install-kubeadm.md +++ b/docs/setup/independent/install-kubeadm.md @@ -86,7 +86,7 @@ apt-get update apt-get install -y docker.io ``` -or install Docker CE 17.03 from Docker's repositories for Ubuntu or Debian: +or install Docker CE 17.09 from Docker's repositories for Ubuntu or Debian: ```bash apt-get update && apt-get install -y curl apt-transport-https @@ -94,7 +94,7 @@ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - cat </etc/apt/sources.list.d/docker.list deb https://download.docker.com/linux/$(lsb_release -si | tr '[:upper:]' '[:lower:]') $(lsb_release -cs) stable EOF -apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 17.03 | head -1 | awk '{print $3}') +apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 17.09 | head -1 | awk '{print $3}') ``` {% endcapture %} From 1beed2d6f6eda35e05ed5a0f3237dc4b5a1709a9 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 24 Nov 2017 10:16:00 +1100 Subject: [PATCH 26/45] rather than emitting text, let's use the package manager https://docs.docker.com/engine/installation/linux/docker-ce/debian/#install-docker-ce-1 --- docs/setup/independent/install-kubeadm.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/setup/independent/install-kubeadm.md b/docs/setup/independent/install-kubeadm.md index 0d26f3f6a3..507aa7c367 100644 --- a/docs/setup/independent/install-kubeadm.md +++ b/docs/setup/independent/install-kubeadm.md @@ -91,9 +91,10 @@ or install Docker CE 17.09 from Docker's repositories for Ubuntu or Debian: ```bash apt-get update && apt-get install -y curl apt-transport-https curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - -cat </etc/apt/sources.list.d/docker.list -deb https://download.docker.com/linux/$(lsb_release -si | tr '[:upper:]' '[:lower:]') $(lsb_release -cs) stable -EOF +add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \ + $(lsb_release -cs) \ + stable" apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 17.09 | head -1 | awk '{print $3}') ``` From ad3870bd87041cd13151607a34ee91ea99b1085c Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 24 Nov 2017 11:43:30 +1100 Subject: [PATCH 27/45] link to official install docs, tweak steps --- docs/setup/independent/install-kubeadm.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/setup/independent/install-kubeadm.md b/docs/setup/independent/install-kubeadm.md index 507aa7c367..65ceb64703 100644 --- a/docs/setup/independent/install-kubeadm.md +++ b/docs/setup/independent/install-kubeadm.md @@ -89,7 +89,12 @@ apt-get install -y docker.io or install Docker CE 17.09 from Docker's repositories for Ubuntu or Debian: ```bash -apt-get update && apt-get install -y curl apt-transport-https +apt-get update +apt-get install \ + apt-transport-https \ + ca-certificates \ + curl \ + software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \ @@ -131,6 +136,9 @@ as Docker (e.g. `cgroupfs`). {% include tabs.md %} +Refer to the [official Docker installation guides](https://docs.docker.com/engine/installation/) +for more information. + ## Installing kubeadm, kubelet and kubectl You will install these packages on all of your machines: From afa7380387c21b1454cd36d3cd1bcfcc93c97cf1 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 24 Nov 2017 11:44:30 +1100 Subject: [PATCH 28/45] -y to automatically install --- docs/setup/independent/install-kubeadm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/setup/independent/install-kubeadm.md b/docs/setup/independent/install-kubeadm.md index 65ceb64703..b07895df7c 100644 --- a/docs/setup/independent/install-kubeadm.md +++ b/docs/setup/independent/install-kubeadm.md @@ -90,7 +90,7 @@ or install Docker CE 17.09 from Docker's repositories for Ubuntu or Debian: ```bash apt-get update -apt-get install \ +apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ From 4c8f3b2996c47a1685cd4ab51caf66a72efc68f5 Mon Sep 17 00:00:00 2001 From: Melanie Albrecht Date: Fri, 24 Nov 2017 11:52:51 +1100 Subject: [PATCH 29/45] Replace link to zookeeper.yaml The link in the sample command "kubectl apply" pointed to a YAML file that was rendered wrongly. I replaced the problem link to a link to the same file on git, which avoids the rendering issue. --- docs/tutorials/stateful-application/zookeeper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/stateful-application/zookeeper.md b/docs/tutorials/stateful-application/zookeeper.md index 5c07373bf3..7b7f1d0b4d 100644 --- a/docs/tutorials/stateful-application/zookeeper.md +++ b/docs/tutorials/stateful-application/zookeeper.md @@ -100,7 +100,7 @@ Open a command terminal, and use manifest. ```shell -kubectl apply -f https://k8s.io/docs/tutorials/stateful-application/zookeeper.yaml +kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/docs/tutorials/stateful-application/zookeeper.yaml ``` This creates the `zk-hs` Headless Service, the `zk-cs` Service, From 93cfe3d59b37cb864ffe093227ead31cc448622d Mon Sep 17 00:00:00 2001 From: kairen Date: Fri, 24 Nov 2017 11:06:38 +0800 Subject: [PATCH 30/45] Remove ditto marks and fix typo --- docs/concepts/storage/persistent-volumes.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/concepts/storage/persistent-volumes.md b/docs/concepts/storage/persistent-volumes.md index 4dccc7bc75..32fdbea9bf 100644 --- a/docs/concepts/storage/persistent-volumes.md +++ b/docs/concepts/storage/persistent-volumes.md @@ -54,7 +54,7 @@ dynamic provisioning for themselves. To enable dynamic storage provisioning based on storage class, the cluster administrator needs to enable the `DefaultStorageClass` [admission controller](/docs/admin/admission-controllers/#defaultstorageclass) on the API server. This can be done, for example, by ensuring that `DefaultStorageClass` is -among the comma-delimited, ordered list of values for the `--admission-control` flag of +among the comma-delimited, ordered list of values for the `--admission-control` flag of the API server component. For more information on API server command line flags, please check [kube-apiserver](/docs/admin/kube-apiserver/) documentation. @@ -79,8 +79,8 @@ When a user is done with their volume, they can delete the PVC objects from the The Retain reclaim policy allows for manual reclamation of the resource. When the `PersistentVolumeClaim` is deleted, the `PersistentVolume` still exists and the volume is considered "released". But it is not yet available for another claim because the previous claimant's data remains on the volume. An administrator can manually reclaim the volume with the following steps. 1. Delete the `PersistentVolume`. The associated storage asset in external infrastructure (such as an AWS EBS, GCE PD, Azure Disk, or Cinder volume) still exists after the PV is deleted. -1. Manually clean up the data on the associated storage asset accordingly. -1. Manually delete the associated storage asset, or if you want to reuse the same storage asset, create a new `PersistentVolume` with the storage asset definition. +2. Manually clean up the data on the associated storage asset accordingly. +3. Manually delete the associated storage asset, or if you want to reuse the same storage asset, create a new `PersistentVolume` with the storage asset definition. #### Recycling @@ -417,8 +417,6 @@ spec: `PersistentVolumes` binds are exclusive, and since `PersistentVolumeClaims` are namespaced objects, mounting claims with "Many" modes (`ROX`, `RWX`) is only possible within one namespace. -`` - ## Writing Portable Configuration If you're writing configuration templates or examples that run on a wide range of clusters @@ -455,4 +453,3 @@ and need persistent storage, we recommend that you use the following pattern: default. At some point, the alpha annotation will cease to have meaning, but the unset `storageClass` field on the PVC will have the desired effect. - From 2aa752dffe2cdd3a7baa9ed9d64f6e66e3e640ff Mon Sep 17 00:00:00 2001 From: Athurg Feng Date: Fri, 24 Nov 2017 12:13:54 +0800 Subject: [PATCH 31/45] Fix the comment's ambiguous Origin commit means volumeMounts.name should match the volume name below, but there's nothing below. --- docs/user-guide/walkthrough/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/user-guide/walkthrough/index.md b/docs/user-guide/walkthrough/index.md index c456638dac..20fd482271 100644 --- a/docs/user-guide/walkthrough/index.md +++ b/docs/user-guide/walkthrough/index.md @@ -97,8 +97,8 @@ volumes: ```yaml volumeMounts: - # name must match the volume name below - - name: redis-persistent-storage +    # name must match the volume name defined in volumes +    - name: redis-persistent-storage # mount path within the container mountPath: /data/redis ``` From a2d2e273677280e17b8daaf6d1492679f9957b7c Mon Sep 17 00:00:00 2001 From: kairen Date: Fri, 24 Nov 2017 13:55:16 +0800 Subject: [PATCH 32/45] Revert the step number --- docs/concepts/storage/persistent-volumes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/concepts/storage/persistent-volumes.md b/docs/concepts/storage/persistent-volumes.md index 32fdbea9bf..aebe9c5cf6 100644 --- a/docs/concepts/storage/persistent-volumes.md +++ b/docs/concepts/storage/persistent-volumes.md @@ -79,8 +79,8 @@ When a user is done with their volume, they can delete the PVC objects from the The Retain reclaim policy allows for manual reclamation of the resource. When the `PersistentVolumeClaim` is deleted, the `PersistentVolume` still exists and the volume is considered "released". But it is not yet available for another claim because the previous claimant's data remains on the volume. An administrator can manually reclaim the volume with the following steps. 1. Delete the `PersistentVolume`. The associated storage asset in external infrastructure (such as an AWS EBS, GCE PD, Azure Disk, or Cinder volume) still exists after the PV is deleted. -2. Manually clean up the data on the associated storage asset accordingly. -3. Manually delete the associated storage asset, or if you want to reuse the same storage asset, create a new `PersistentVolume` with the storage asset definition. +1. Manually clean up the data on the associated storage asset accordingly. +1. Manually delete the associated storage asset, or if you want to reuse the same storage asset, create a new `PersistentVolume` with the storage asset definition. #### Recycling From ec4fbf70d4a9305a992839892e1f936e7c12f889 Mon Sep 17 00:00:00 2001 From: Suraj Deshmukh Date: Fri, 24 Nov 2017 15:43:48 +0530 Subject: [PATCH 33/45] add link to Application Introspection and Debugging guide --- .../debug-application-introspection.md | 27 +++---------------- .../debug-application-cluster/nginx-dep.yaml | 20 ++++++++++++++ 2 files changed, 23 insertions(+), 24 deletions(-) create mode 100644 docs/tasks/debug-application-cluster/nginx-dep.yaml diff --git a/docs/tasks/debug-application-cluster/debug-application-introspection.md b/docs/tasks/debug-application-cluster/debug-application-introspection.md index a149efba6f..917cc18d5a 100644 --- a/docs/tasks/debug-application-cluster/debug-application-introspection.md +++ b/docs/tasks/debug-application-cluster/debug-application-introspection.md @@ -16,33 +16,12 @@ your pods. But there are a number of ways to get even more information about you For this example we'll use a Deployment to create two pods, similar to the earlier example. -```yaml -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: nginx-deployment -spec: - replicas: 2 - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - image: nginx - resources: - limits: - memory: "128Mi" - cpu: "500m" - ports: - - containerPort: 80 -``` +{% include code.html language="yaml" file="nginx-dep.yaml" ghlink="/docs/tasks/debug-application-cluster/nginx-dep.yaml" %} -Copy this to a file *./my-nginx-dep.yaml* +Create deployment by running following command: ```shell -$ kubectl create -f ./my-nginx-dep.yaml +$ kubectl create -f https://k8s.io/docs/tasks/debug-application-cluster/nginx-dep.yaml deployment "nginx-deployment" created ``` diff --git a/docs/tasks/debug-application-cluster/nginx-dep.yaml b/docs/tasks/debug-application-cluster/nginx-dep.yaml new file mode 100644 index 0000000000..9051645fbb --- /dev/null +++ b/docs/tasks/debug-application-cluster/nginx-dep.yaml @@ -0,0 +1,20 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: nginx-deployment +spec: + replicas: 2 + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx + resources: + limits: + memory: "128Mi" + cpu: "500m" + ports: + - containerPort: 80 From 4c347ea69d86d9c9c8100896c20ec87ea61d1078 Mon Sep 17 00:00:00 2001 From: Qiming Date: Fri, 24 Nov 2017 19:11:37 +0800 Subject: [PATCH 34/45] Update podpreset.md --- docs/tasks/inject-data-application/podpreset.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/tasks/inject-data-application/podpreset.md b/docs/tasks/inject-data-application/podpreset.md index 707a451eff..4368608690 100644 --- a/docs/tasks/inject-data-application/podpreset.md +++ b/docs/tasks/inject-data-application/podpreset.md @@ -31,7 +31,7 @@ kubectl create -f https://k8s.io/docs/tasks/inject-data-application/podpreset-pr Examine the created PodPreset: ```shell -kubectl get podpreset +$ kubectl get podpreset NAME AGE allow-database 1m ``` @@ -43,13 +43,13 @@ The new PodPreset will act upon any pod that has label `role: frontend`. Create a pod: ```shell -kubectl create -f https://k8s.io/docs/tasks/inject-data-application/podpreset-pod.yaml +$ kubectl create -f https://k8s.io/docs/tasks/inject-data-application/podpreset-pod.yaml ``` List the running Pods: ```shell -kubectl get pods +$ kubectl get pods NAME READY STATUS RESTARTS AGE website 1/1 Running 0 4m ``` @@ -61,7 +61,7 @@ website 1/1 Running 0 4m To see above output, run the following command: ```shell -kubectl get pod website -o yaml +$ kubectl get pod website -o yaml ``` ### Pod Spec with `ConfigMap` Example @@ -145,7 +145,7 @@ when there is a conflict. **If we run `kubectl describe...` we can see the event:** -``` +```shell $ kubectl describe ... .... Events: From 4456f5f90bc7c39437f50800dbd282fb6f950f92 Mon Sep 17 00:00:00 2001 From: Ziqi Zhao Date: Sun, 26 Nov 2017 16:21:32 +0800 Subject: [PATCH 35/45] Fix typos Signed-off-by: Ziqi Zhao --- docs/tasks/access-kubernetes-api/setup-extension-api-server.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tasks/access-kubernetes-api/setup-extension-api-server.md b/docs/tasks/access-kubernetes-api/setup-extension-api-server.md index bd9404a1b4..591bf441c9 100644 --- a/docs/tasks/access-kubernetes-api/setup-extension-api-server.md +++ b/docs/tasks/access-kubernetes-api/setup-extension-api-server.md @@ -38,7 +38,7 @@ Alternatively, you can use an existing 3rd party solution, such as [apiserver-bu 1. Create a Kubernetes service account in your namespace. 1. Create a Kubernetes cluster role for the operations you want to allow on your resources. 1. Create a Kubernetes cluster role binding from the default service account in your namespace to the cluster role you just created. -1. Create a Kubernetes apiservice. The CA cert above should be base 64 encoded, stripped of new lines and used as the spec.caBundle in the apiservce. This should not be namespaced. +1. Create a Kubernetes apiservice. The CA cert above should be base 64 encoded, stripped of new lines and used as the spec.caBundle in the apiservice. This should not be namespaced. 1. Use kubectl to get your resource. It should return "No resources found." Which means that everything worked but you currently have no objects of that resource type created yet. {% endcapture %} From 328e6794d2e621697caf2be186f3b840cd9dc64a Mon Sep 17 00:00:00 2001 From: Wang Jie Date: Mon, 27 Nov 2017 11:59:42 +0800 Subject: [PATCH 36/45] Update quota-api-object.md --- docs/tasks/administer-cluster/quota-api-object.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tasks/administer-cluster/quota-api-object.md b/docs/tasks/administer-cluster/quota-api-object.md index fd3fdd2236..978cc02037 100644 --- a/docs/tasks/administer-cluster/quota-api-object.md +++ b/docs/tasks/administer-cluster/quota-api-object.md @@ -67,7 +67,7 @@ status: services.nodeports: "0" ``` -## Create a PersistentVolumeClaim: +## Create a PersistentVolumeClaim Here is the configuration file for a PersistentVolumeClaim object: @@ -92,7 +92,7 @@ NAME STATUS pvc-quota-demo Pending ``` -## Attempt to create a second PersistentVolumeClaim: +## Attempt to create a second PersistentVolumeClaim Here is the configuration file for a second PersistentVolumeClaim: From b268cd767894635d1af14d6fa10aadb07185dbe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=AE=8F?= Date: Mon, 27 Nov 2017 14:59:38 +0800 Subject: [PATCH 37/45] Fix invalid link. --- docs/concepts/workloads/pods/init-containers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/concepts/workloads/pods/init-containers.md b/docs/concepts/workloads/pods/init-containers.md index b1b7120d46..355620ad12 100644 --- a/docs/concepts/workloads/pods/init-containers.md +++ b/docs/concepts/workloads/pods/init-containers.md @@ -89,7 +89,7 @@ Here are some ideas for how to use Init Containers: configuration file using Jinja. More detailed usage examples can be found in the [StatefulSets documentation](/docs/concepts/workloads/controllers/statefulset/) -and the [Production Pods guide](/docs/tasks/#handling-initialization). +and the [Production Pods guide](/docs/tasks/configure-pod-container/configure-pod-initialization/). ### Init Containers in use From 3f98c8bd2aa6095975c15a0a7e0ec5d1470ce0f2 Mon Sep 17 00:00:00 2001 From: Qiming Date: Mon, 27 Nov 2017 20:28:44 +0800 Subject: [PATCH 38/45] Update overview.md --- docs/concepts/configuration/overview.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/concepts/configuration/overview.md b/docs/concepts/configuration/overview.md index 27fbc350eb..c3673a1386 100644 --- a/docs/concepts/configuration/overview.md +++ b/docs/concepts/configuration/overview.md @@ -45,9 +45,17 @@ This is a living document. If you think of something that is not on this list bu 2. Create a service; 3. Then scale up the replication controller. -- Don't use `hostPort` unless it is absolutely necessary (for example: for a node daemon). It specifies the port number to expose on the host. When you bind a Pod to a `hostPort`, there are a limited number of places to schedule a pod due to port conflicts. The conflict comes from being limited to a single `hostIP:hostPort:protocol` combination. Different `hostIP:hostPort:protocol` combinations mean different requirements. For example, a pod that binds tcp 80 host port on 127.0.0.1 does not conflict with another pod that binds tcp 80 port on 127.0.0.2. +- Don't use `hostPort` unless it is absolutely necessary (for example: for a node daemon). + It specifies the port number to expose on the host. + When you bind a Pod to a `hostPort`, there are a limited number of places to schedule a pod due to port conflicts. + The conflict comes from the requirement of an unique combination. + Different combinations mean different requirements. + For example, a pod that binds to host port 80 on 127.0.0.1 with TCP protocol has no conflict with another Pod that binds to host port 80 on 127.0.0.2 with TCP protocol. - Special notes on hostIP and protocol, if you don't specify the hostIP and protocol explicitly, kubernetes will give you 0.0.0.0 and tcp as default hostIP and protocol. And "0.0.0.0" is a wildcard hostIP that will occupy all <_,hostPort,protocol> on the node the pod is scheduled on. Specifically, it will occupy all for all IPs on the host. + *Special notes on hostIP and protocol*: If you don't specify the hostIP and protocol explicitly, + kubernetes will give you 0.0.0.0 and tcp as the default hostIP and protocol, + where "0.0.0.0" is a wildcard IP that will match all <*,hostPort,protocol> on the node the pod is scheduled on. + Specifically, it will match all tuples for all IPs on the host. If you only need access to the port for debugging purposes, you can use the [kubectl proxy and apiserver proxy](/docs/tasks/access-kubernetes-api/http-proxy-access-api/) or [kubectl port-forward](/docs/tasks/access-application-cluster/port-forward-access-application-cluster/). You can use a [Service](/docs/concepts/services-networking/service/) object for external service access. From 4d77e7993f875c7bf355e4305e5e0ceaf99e5ea3 Mon Sep 17 00:00:00 2001 From: Qiming Date: Mon, 27 Nov 2017 20:30:10 +0800 Subject: [PATCH 39/45] Update overview.md --- docs/concepts/configuration/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/concepts/configuration/overview.md b/docs/concepts/configuration/overview.md index c3673a1386..fb045fbfab 100644 --- a/docs/concepts/configuration/overview.md +++ b/docs/concepts/configuration/overview.md @@ -53,7 +53,7 @@ This is a living document. If you think of something that is not on this list bu For example, a pod that binds to host port 80 on 127.0.0.1 with TCP protocol has no conflict with another Pod that binds to host port 80 on 127.0.0.2 with TCP protocol. *Special notes on hostIP and protocol*: If you don't specify the hostIP and protocol explicitly, - kubernetes will give you 0.0.0.0 and tcp as the default hostIP and protocol, + kubernetes will use 0.0.0.0 and TCP as the default hostIP and protocol, where "0.0.0.0" is a wildcard IP that will match all <*,hostPort,protocol> on the node the pod is scheduled on. Specifically, it will match all tuples for all IPs on the host. From 3fa8cb3cfd5345fbff5f7ae557a94422fc5c4943 Mon Sep 17 00:00:00 2001 From: Martyn Ranyard Date: Mon, 27 Nov 2017 18:12:49 +0100 Subject: [PATCH 40/45] Adds a note regarding the toleration of node-role.kubernetes.io/master Also updates the example fluentd daemonset which should run on all nodes. --- docs/concepts/workloads/controllers/daemonset.md | 2 ++ docs/concepts/workloads/controllers/daemonset.yaml | 3 +++ 2 files changed, 5 insertions(+) diff --git a/docs/concepts/workloads/controllers/daemonset.md b/docs/concepts/workloads/controllers/daemonset.md index 3c5898a3fd..d29c91ea0b 100644 --- a/docs/concepts/workloads/controllers/daemonset.md +++ b/docs/concepts/workloads/controllers/daemonset.md @@ -129,6 +129,8 @@ labelled as critical, the Daemon pods are created with an additional Note that all above `NoSchedule` taints above are created only in version 1.8 or later if the alpha feature `TaintNodesByCondition` is enabled. +Also note that the `node-role.kubernetes.io/master` `NoSchedule` toleration specified in the above example is needed on 1.6 or later to schedule on *master* nodes as this is not a default toleration. + ## Communicating with Daemon Pods Some possible patterns for communicating with Pods in a DaemonSet are: diff --git a/docs/concepts/workloads/controllers/daemonset.yaml b/docs/concepts/workloads/controllers/daemonset.yaml index 1788487382..5f849a30f8 100644 --- a/docs/concepts/workloads/controllers/daemonset.yaml +++ b/docs/concepts/workloads/controllers/daemonset.yaml @@ -14,6 +14,9 @@ spec: labels: name: fluentd-elasticsearch spec: + tolerations: + - key: node-role.kubernetes.io/master + effect: NoSchedule containers: - name: fluentd-elasticsearch image: gcr.io/google-containers/fluentd-elasticsearch:1.20 From 6ee7947a03962e7d434140fe8322729c0ebb78ef Mon Sep 17 00:00:00 2001 From: Eric Tune Date: Mon, 27 Nov 2017 14:17:15 -0800 Subject: [PATCH 41/45] Added overview concept guide to all ways to extend (#6224) * Added overview concept guide to all ways to extend * Address review comments. Remove double space. Use glossary. Use ordered list. etc. --- _data/concepts.yml | 1 + _data/glossary/platform-developer.yaml | 3 +- docs/concepts/overview/extending.md | 219 +++++++++++++++++++++++++ 3 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 docs/concepts/overview/extending.md diff --git a/_data/concepts.yml b/_data/concepts.yml index 1051266be0..0a0fc14143 100644 --- a/_data/concepts.yml +++ b/_data/concepts.yml @@ -24,6 +24,7 @@ toc: - title: Extending Kubernetes section: + - docs/concepts/overview/extending.md - title: Extending the Kubernetes API section: - docs/concepts/api-extension/apiserver-aggregation.md diff --git a/_data/glossary/platform-developer.yaml b/_data/glossary/platform-developer.yaml index 85decd55f3..94be671d79 100644 --- a/_data/glossary/platform-developer.yaml +++ b/_data/glossary/platform-developer.yaml @@ -2,9 +2,10 @@ id: platform-developer name: Platform Developer aka: - Kubernetes Developer + - Extension Developer tags: - user-type short-description: > A person who customizes the Kubernetes platform to fit the needs of their project. long-description: > - A platform developer may, for example, use [Custom Resources](/docs/concepts/api-extension/custom-resources/) or [Extend the Kubernetes API with the aggregation layer](/docs/concepts/api-extension/apiserver-aggregation/) to add functionality to their instance of Kubernetes, specifically for their application. + A platform developer may, for example, use [Custom Resources](/docs/concepts/api-extension/custom-resources/) or [Extend the Kubernetes API with the aggregation layer](/docs/concepts/api-extension/apiserver-aggregation/) to add functionality to their instance of Kubernetes, specifically for their application. Some Platfor Developers are also {% glossary_tooltip text="contributors" term_id="member" %} and develop extensions which are contributed to the Kubernetes community. Others develop closed-source commercial or site-specific extensions. diff --git a/docs/concepts/overview/extending.md b/docs/concepts/overview/extending.md new file mode 100644 index 0000000000..939a73618b --- /dev/null +++ b/docs/concepts/overview/extending.md @@ -0,0 +1,219 @@ +--- +title: Extending your Kubernetes Cluster +approvers: +- erictune +- lavalamp +- cheftako +- chenopis +--- + +{% capture overview %} + +Kubernetes is highly configurable and extensible. As a result, +there is rarely a need to fork or submit patches to the Kubernetes +project code. + +This guide describes the options for customizing a Kubernetes +cluster. It is aimed at **Cluster Operators** who want to +understand how to adapt their Kubernetes cluster to the needs of +their work environment. Developers who are prospective **Platform +Developers** or Kubernetes Project **Contributors** will also find it +useful as an introduction to what extension points and patterns +exist, and their tradeoffs and limitations. + +{% glossary_definition term_id="cluster-operator" length="all" %} +{% glossary_definition term_id="platform-developer" length="all" %} +{% glossary_definition term_id="contributor" length="all" %} + +{% endcapture %} + + +{% capture body %} + +## Overview + +Customization approaches can be broadly divided into *configuration*, which only involves changing flags, local configuration files, or API resources; and *extensions*, which involve running additional programs or services. This document is primarily about extensions. + +## Configuration + +*Configuration files* and *flags* are documented in the Reference section of the online documentation, under each binary: + +* [kubelet](/docs/admin/kubelet/) +* [kube-apiserver](/docs/admin/kube-apiserver/) +* [kube-controller-manager](/docs/admin/kube-controller-manager/) +* [kube-scheduler](/docs/admin/kube-scheduler/). + +Flags and configuration files may not always be changable in a hosted Kubernetes service or a distribution with managed installation. When they are changable, they are usually only changeable by the cluster administrator. Also, they are subject to change in future Kubernetes versions, and setting them may require restarting processes. For those reasons, they should be used only when there are no other options. + +*Built-in Policy APIs*, such as [ResourceQuota](/docs/concepts/policy/resource-quotas/), [PodSecurityPolicies](/docs/concepts/policy/pod-security-policy/), [NetworkPolicy](/docs/concepts/services-networking/network-policies/) and Role-based Access Control ([RBAC](/docs/admin/authorization/rbac/)), are built-in Kubernetes APIs. APIs are typically used with hosted Kubernetes services and with managed Kubernetes installations. They are declarative and use the same conventions as other Kubernetes resources like pods, so new cluster configuration can be repeatable and be managed the same way as applications. And, where they are stable, they enjoy a [defined support policy](/docs/reference/deprecation-policy/) like other Kubernetes APIs. For these reasons, they are preferred over *configuration files* and *flags* where suitable. + +## Extensions + +Extensions are software components that extend and deeply integrate with Kubernetes. +They adapt it to support new types and new kinds of hardware. + +Most cluster administrators will use a hosted or distribution +instance of Kubernetes. As a result, most Kubernetes users will need to +install extensions and fewer will need to author new ones. + +## Extension Patterns + +Kubernetes is designed to be automated by writing client programs. Any +program that reads and/or writes to the Kubernetes API can provide useful +automation. *Automation* can run on the cluster or off it. By following +the guidance in this doc you can write highly available and robust automation. +Automation generally works with any Kubernetes cluster, including hosted +clusters and managed installations. + +There is a specific pattern for writing client programs that work well with +Kubernetes called the *Controller* pattern. Controllers typically read an +object's `.spec`, possibly do things, and then update the object's `.status`. + +A controller is a client of Kubernetes. When Kubernetes is the client and +calls out to a remote service, it is called a *Webhook*. The remote service +is called a *Webhook Backend*. Like Controllers, Webhooks do add a point of +failure. + +In the webhook model, Kubernetes makes a network request to a remote service. +In the *Binary Plugin* model, Kubernetes executes a binary (program). +Binary plugins are used by the kubelet (e.g. [Flex Volume +Plugins](https://github.com/kubernetes/community/blob/master/contributors/devel/flexvolume.md) +and [Network +Plugins](/docs/concepts/cluster-administration/network-plugins/)) +and by kubectl. + +Below is a diagram showing how the extensions points interact with the +Kubernetes control plane. + + + + + + +## Extension Points + +This diagram shows the extension points in a Kubernetes system. + + + + + +1. Users often interact with the Kubernetes API using `kubectl`. [Kubectl plugins](docs/tasks/extend-kubectl/kubectl-plugins) extend the kubectl binary. They only affect the individual user's local environment, and so cannot enforce site-wide policies. +2. The apiserver handles all requests. Several types of extension points in the apiserver allow authenticating requests, or blocking them based on their content, editing content, and handling deletion. These are described in the [API Access Extensions](docs/concepts/overview/extending#api-access-extensions) section. +3. The apiserver serves various kinds of *resources*. *Built-in resource kinds*, like `pods`, are defined by the Kubernetes project and can't be changed. You can also add resources that you define, or that other projects have defined, called *Custom Resources*, as explained in the [Custom Resources](docs/concepts/overview/extending#custom-resources) section. Custom Resources are often used with API Access Extensions. +4. The Kubernetes scheduler decides which nodes to place pods on. There are several ways to extend scheduling. These are described in the [Scheduler Extensions](docs/concepts/overview/extending#shceduler-extensions) section. +5. Much of the behavior of Kubernetes is implemented by programs called Controllers which are clients of the API-Server. Controllers are often used in conjunction with Custom Resources. +6. The kubelet runs on servers, and helps pods appear like virtual servers with their own IPs on the cluster network. [Network Plugins](docs/concepts/overview/extending#network-plugins) allow for different implementations of pod networking. +7. The kubelet also mounts and unmounts volumes for containers. New types of storage can be supported via [Storage Plugins](docs/concepts/overview/extending#storage-plugins). + +If you are unsure where to start, this flowchart can help. Note that some solutions may involve several types of extensions. + + + + + + +## API Extensions +### User-Defined Types + +Consider adding a Custom Resource to Kubernetes if you want to define new controllers, application configuration objects or other declarative APIs, and to manage them using Kubernetes tools, such as `kubectl`. + +Do not use a Custom Resource as data storage for application, user, or monitoring data. + +For more about Custom Resources, see the [Custom Resources concept guide](/docs/concepts/api-extension/custom-resources.md). + + +### Combining New APIs with Automation + +Often, when you add a new API, you also add a control loop that reads and/or writes the new APIs. When the combination of a Custom API and a control loop is used to manage a specific, usually stateful, application, this is called the *Operator* pattern. Custom APIs and control loops can also be used to control other resources, such as storage, policies, and so on. + +### Changing Built-in Resources + +When you extend the Kubernetes API by adding custom resources, the added resources always fall into a new API Groups. You cannot replace or change existing API groups. +Adding an API does not directly let you affect the behavior of existing APIs (e.g. Pods), but API Access Extensions do. + + +### API Access Extensions + +When a request reaches the Kubernetes API Server, it is first Authenticated, then Authorized, then subject to various types of Admission Control. See [[Accessing the API](/docs/admin/accessing-the-api/)] for more on this flow. + +Each of these steps offers extension points. + +Kubernetes has several built-in authentication methods that it supports. It can also sit behind an authenticating proxy, and it can send a token from an Authorization header to a remote service for verification (a webhook). All of these methods are covered in the [Authentication documentation](/docs/admin/authentication/). + +### Authentication + +[Authentication](/docs/admin/authentication) maps headers or certificates in all requests to a username for the client making the request. + +Kubernetes provides several built-in authentication methods, and an [Authentication webhook](/docs/admin/authentication/#webhook-token-authentication) method if those don't meet your needs. + + +### Authorization + + [Authorization](/docs/admin/authorization/webhook/) determines whether specific users can read, write, and do other operations on API resources. It just works at the level of whole resources -- it doesn't discriminate based on arbitrary object fields. If the built-in authorization options don't meet your needs, and [Authorization webhook](/docs/admin/authorization/webhook/) allows calling out to user-provided code to make an authorization decision. + + +### Dynamic Admission Control + +After a request is authorized, if it is a write operation, it also t goes through [Admission Control](/docs/admin/admission-controllers/) steps. In addition to the built-in steps, there are several extensions: + +* The [Image Policy webhook](/docs/admin/admission-controllers/#imagepolicywebhook) restricts what images can be run in containers. +* To make arbitrary admission control decisions, a general [Admission webhook](/docs/admin/extensible-admission-controllers/#external-admission-webhooks) can be used. Admission Webhooks can reject creations or updates. +* [Initializers](/docs/admin/extensible-admission-controllers/#initializers) are controllers that can modify objects before they are created. Intializers can modify initial object creations but cannot affect updates to objects. Initializers can also reject objects. + +## Infrastructure Extensions + + +### Storage Plugins + +[Flex Volumes](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/flexvolume-deployment.md +) allow users to mount volume types without built-in support by having the +Kubelet call a Binary Plugin to mount the volume. + + +### Device Plugins + +Device plugins allow a node to discover new Node resources (in addition to the +builtin ones like cpu and memory) via a [Device +Plugin](/docs/concepts/cluster-administration/device-plugins/). + + +### Network Plugins + +Different networking fabrics can be supported via node-level [Network Plugins](/docs/admin/network-plugins/). + +### Scheduler Extensions + +The scheduler is a special type of controller that watches pods, and assigns +pods to nodes. The default scheduler can be be replaced entirely, while +continuing to use other Kubernetes components, or [multiple +schedulers](/docs/tasks/administer-cluster/configure-multiple-schedulers/) +can run at the same time. + +This is a significant undertaking, and almost all Kubernetes users find they +do not need to modify the scheduler. + +The scheduler also supports a +[webhook](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/scheduler_extender.md) +that permits a webhook backend (scheduler extension) to filter and prioritize +the nodes chosen for a pod. + +{% endcapture %} + + +{% capture whatsnext %} + +* Learn more about [Custom Resources](/docs/concepts/api-extension/custom-resources/) +* Learn about [Dynamic admission control](/docs/admin/extensible-admission-controller) +* Learn more about Infrastructure extensions + * [Network Plugins](/docs/concepts/cluster-administration/network-plugin) + * [Device Plugins](/docs/concepts/cluster-administration/device-plugins.md) +* Learn about [kubectl plugins](/docs/tasks/extend-kubectl/kubectl-plugin) +* See examples of Automation + * [List of Operators](https://github.com/coreos/awesome-kubernetes-extensions) + +{% endcapture %} + +{% include templates/concept.md %} + + From 865698f795b3d7c05c04039de735128edf2de6a4 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Mon, 27 Nov 2017 14:43:36 -0800 Subject: [PATCH 42/45] Add tooltip includes for terms --- _data/glossary/platform-developer.yaml | 2 +- docs/concepts/overview/extending.md | 16 ++++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/_data/glossary/platform-developer.yaml b/_data/glossary/platform-developer.yaml index 94be671d79..8d0c556d06 100644 --- a/_data/glossary/platform-developer.yaml +++ b/_data/glossary/platform-developer.yaml @@ -8,4 +8,4 @@ tags: short-description: > A person who customizes the Kubernetes platform to fit the needs of their project. long-description: > - A platform developer may, for example, use [Custom Resources](/docs/concepts/api-extension/custom-resources/) or [Extend the Kubernetes API with the aggregation layer](/docs/concepts/api-extension/apiserver-aggregation/) to add functionality to their instance of Kubernetes, specifically for their application. Some Platfor Developers are also {% glossary_tooltip text="contributors" term_id="member" %} and develop extensions which are contributed to the Kubernetes community. Others develop closed-source commercial or site-specific extensions. + A platform developer may, for example, use [Custom Resources](/docs/concepts/api-extension/custom-resources/) or [Extend the Kubernetes API with the aggregation layer](/docs/concepts/api-extension/apiserver-aggregation/) to add functionality to their instance of Kubernetes, specifically for their application. Some Platform Developers are also {% glossary_tooltip text="contributors" term_id="contributor" %} and develop extensions which are contributed to the Kubernetes community. Others develop closed-source commercial or site-specific extensions. diff --git a/docs/concepts/overview/extending.md b/docs/concepts/overview/extending.md index 939a73618b..89c34a40c4 100644 --- a/docs/concepts/overview/extending.md +++ b/docs/concepts/overview/extending.md @@ -14,16 +14,12 @@ there is rarely a need to fork or submit patches to the Kubernetes project code. This guide describes the options for customizing a Kubernetes -cluster. It is aimed at **Cluster Operators** who want to +cluster. It is aimed at {% glossary_tooltip text="Cluster Operators" term_id="cluster-operator" %} who want to understand how to adapt their Kubernetes cluster to the needs of -their work environment. Developers who are prospective **Platform -Developers** or Kubernetes Project **Contributors** will also find it +their work environment. Developers who are prospective {% glossary_tooltip text="Platform +Developers" term_id="platform-developer" %} or Kubernetes Project {% glossary_tooltip text="Contributors" term_id="contributor" %} will also find it useful as an introduction to what extension points and patterns -exist, and their tradeoffs and limitations. - -{% glossary_definition term_id="cluster-operator" length="all" %} -{% glossary_definition term_id="platform-developer" length="all" %} -{% glossary_definition term_id="contributor" length="all" %} +exist, and their trade-offs and limitations. {% endcapture %} @@ -43,7 +39,7 @@ Customization approaches can be broadly divided into *configuration*, which only * [kube-controller-manager](/docs/admin/kube-controller-manager/) * [kube-scheduler](/docs/admin/kube-scheduler/). -Flags and configuration files may not always be changable in a hosted Kubernetes service or a distribution with managed installation. When they are changable, they are usually only changeable by the cluster administrator. Also, they are subject to change in future Kubernetes versions, and setting them may require restarting processes. For those reasons, they should be used only when there are no other options. +Flags and configuration files may not always be changeable in a hosted Kubernetes service or a distribution with managed installation. When they are changeable, they are usually only changeable by the cluster administrator. Also, they are subject to change in future Kubernetes versions, and setting them may require restarting processes. For those reasons, they should be used only when there are no other options. *Built-in Policy APIs*, such as [ResourceQuota](/docs/concepts/policy/resource-quotas/), [PodSecurityPolicies](/docs/concepts/policy/pod-security-policy/), [NetworkPolicy](/docs/concepts/services-networking/network-policies/) and Role-based Access Control ([RBAC](/docs/admin/authorization/rbac/)), are built-in Kubernetes APIs. APIs are typically used with hosted Kubernetes services and with managed Kubernetes installations. They are declarative and use the same conventions as other Kubernetes resources like pods, so new cluster configuration can be repeatable and be managed the same way as applications. And, where they are stable, they enjoy a [defined support policy](/docs/reference/deprecation-policy/) like other Kubernetes APIs. For these reasons, they are preferred over *configuration files* and *flags* where suitable. @@ -159,7 +155,7 @@ After a request is authorized, if it is a write operation, it also t goes throug * The [Image Policy webhook](/docs/admin/admission-controllers/#imagepolicywebhook) restricts what images can be run in containers. * To make arbitrary admission control decisions, a general [Admission webhook](/docs/admin/extensible-admission-controllers/#external-admission-webhooks) can be used. Admission Webhooks can reject creations or updates. -* [Initializers](/docs/admin/extensible-admission-controllers/#initializers) are controllers that can modify objects before they are created. Intializers can modify initial object creations but cannot affect updates to objects. Initializers can also reject objects. +* [Initializers](/docs/admin/extensible-admission-controllers/#initializers) are controllers that can modify objects before they are created. Initializers can modify initial object creations but cannot affect updates to objects. Initializers can also reject objects. ## Infrastructure Extensions From ca84eb508582e681ca375e56631da87680fdd3f3 Mon Sep 17 00:00:00 2001 From: Ahmet Alp Balkan Date: Mon, 27 Nov 2017 15:28:33 -0800 Subject: [PATCH 43/45] /docs/reference sidebar improvements (#6411) Attempt at making the left sidebar for /docs/reference more useful, I've got some more sidebar improvements I'm saving for other PRs for this area. Signed-off-by: Ahmet Alp Balkan --- _data/reference.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/_data/reference.yml b/_data/reference.yml index 5c9ba3d2c1..4275214b3a 100644 --- a/_data/reference.yml +++ b/_data/reference.yml @@ -64,11 +64,7 @@ toc: - docs/user-guide/jsonpath.md - docs/user-guide/kubectl-cheatsheet.md -- title: Cloud Controller Manager - section: - - docs/reference/generated/cloud-controller-manager.md - -- title: Setup Tools +- title: Setup Tools Reference section: - docs/reference/generated/kubeadm.md - title: Kubefed @@ -80,7 +76,7 @@ toc: - docs/reference/generated/kubefed_unjoin.md - docs/reference/generated/kubefed_version.md -- title: Config Reference +- title: Command-line Tools Reference section: - docs/reference/generated/kubelet.md - docs/admin/kubelet-authentication-authorization.md @@ -89,6 +85,7 @@ toc: - docs/reference/generated/kube-proxy.md - docs/reference/generated/kube-scheduler.md - docs/admin/kubelet-tls-bootstrapping.md + - docs/reference/generated/cloud-controller-manager.md - docs/reference/generated/federation-apiserver.md - docs/reference/generated/federation-controller-manager.md From e1d8864d5254825aa358b7daf60505d0f8ae69d8 Mon Sep 17 00:00:00 2001 From: Aditya Mukerjee Date: Mon, 27 Nov 2017 19:14:36 -0500 Subject: [PATCH 44/45] Explicitly version Clientset in example (#6446) Core() is deprecated in favor of CoreV1 --- docs/tasks/administer-cluster/access-cluster-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tasks/administer-cluster/access-cluster-api.md b/docs/tasks/administer-cluster/access-cluster-api.md index 7929387906..561ff96408 100644 --- a/docs/tasks/administer-cluster/access-cluster-api.md +++ b/docs/tasks/administer-cluster/access-cluster-api.md @@ -136,7 +136,7 @@ import ( // creates the clientset clientset, _:= kubernetes.NewForConfig(config) // access the API to list pods - pods, _:= clientset.Core().Pods("").List(v1.ListOptions{}) + pods, _:= clientset.CoreV1().Pods("").List(v1.ListOptions{}) fmt.Printf("There are %d pods in the cluster\n", len(pods.Items)) ... ``` From e17bb06830c4d9001ef782473865adc598c1faf9 Mon Sep 17 00:00:00 2001 From: Itay Shakury Date: Tue, 28 Nov 2017 02:59:45 +0200 Subject: [PATCH 45/45] correct reference for pre 1.8 api version (#6403) apps/v1beta1 -> extensions/v1beta1 --- docs/concepts/workloads/controllers/daemonset.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/concepts/workloads/controllers/daemonset.yaml b/docs/concepts/workloads/controllers/daemonset.yaml index 1788487382..dac78d5d42 100644 --- a/docs/concepts/workloads/controllers/daemonset.yaml +++ b/docs/concepts/workloads/controllers/daemonset.yaml @@ -1,4 +1,4 @@ -apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1 +apiVersion: apps/v1beta2 # for versions before 1.8.0 use extensions/v1beta1 kind: DaemonSet metadata: name: fluentd-elasticsearch